Django--orm--关系字段(一对多)

一、关系字段

一对多

外键类型在ORM中用来表示外键关联关系,一般吧ForeignKey字段设置在’一对多’中’多的一方’.
例如:一个学科对应多个学生,一个学生对应一个学科
在这里插入图片描述
字段: ForeignKey
字段参数:
to : 设置要关联的表。
to_field : 设置要关联的表的字段。 默认关联的是表的id。
如果想关联其他字段名称可以使用此字段。
on_delete: 当删除关联表中的数据时,当前表与其关联的行的行为。
models.CASCADE :删除关联数据,与之关联也删除。
models.DO_NOTHING:删除关联数据,引发错误IntegrityError。
models.PROTECT: 删除关联数据,引发错误ProtectedError。

(1)增
练习1: 新增学员赵四 学python 学科
方式一:
#sub_obj = models.Subject.objects.get(name=‘python’)
#sub_obj.student_set.create(name=‘赵四’, age=23)
方式二:
#sub_obj = models.Subject.objects.get(name=‘python’)
#student_obj = models.Student()
#student_obj.name = ‘赵四1’
#student_obj.age = 31
#student_obj.subject = sub_obj
#student_obj.save()
(2)删
(1). 赵四退学
models.Student.objects.get(name=‘赵四’).delete()
(2). python 解散
models.Subject.objects.get(name=‘python’).delete()
(3)改
修改 将赵四 修改成学java
sub_obj = models.Subject.objects.get(name=‘java’)
student_obj = models.Student.objects.get(name=‘赵四’)
sub_obj.student_set.set([student_obj])
(4)查
(1).正向查询 张三的学科
# student_obj = models.Student.objects.get(name=‘张三’)
# subject_obj = student_obj.subject # 直接是对象
#print(subject_obj)
(2).反向查询 python学科对应的学生
# subject_obj = models.Subject.objects.get(name=‘python’)
# student_obj_list = subject_obj.student_set.all()
#print(student_obj_list)
#<QuerySet [<Student: name:张三>, <Student: name:李四>]>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django ORM 实现多态一对多关系,可以使用 Django ContentTypes 库。该库允许您为任何模型创建一个通用的外键字段,该字段可以引用另一个模型的实例,而无需直接指定模型。 具体实现步骤如下: 1. 首先,安装 Django ContentTypes 库:`pip install django-contenttypes` 2. 在 models.py 定义多态模型: ```python from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.db import models class ParentModel(models.Model): name = models.CharField(max_length=50) class ChildModel1(models.Model): parent = models.ForeignKey(ParentModel, on_delete=models.CASCADE) # 定义通用外键 content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') class ChildModel2(models.Model): parent = models.ForeignKey(ParentModel, on_delete=models.CASCADE) # 定义通用外键 content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') ``` 3. 在视图函数,可以根据需求获取多态模型的实例: ```python from django.contrib.contenttypes.models import ContentType # 获取 ParentModel 的所有子模型 child_models = [ChildModel1, ChildModel2] # 获取 ParentModel 的实例 parent = ParentModel.objects.get(id=1) # 获取 ParentModel 的所有子模型实例 child_instances = [] for child_model in child_models: content_type = ContentType.objects.get_for_model(child_model) child_instances += child_model.objects.filter(content_type=content_type, object_id=parent.id) # 对子模型实例进行操作 for child_instance in child_instances: # ... ``` 以上就是在 Django ORM 实现多态一对多关系的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值