学生的学院 —— 正向查
学院的学生 —— 反向查
①表关联对象
可以在项目目录下通过 python manage.py shell 进入到当前目录下的 python 的 idle。
如果一个模型具有 ForeignKey,那么该模型的实例将可以通过属性访问关联的(外部)对象。
>>> from .models import Department, Student, Course
>>> s1 = Students.objects.get(s_id=1)
>>> s1
<Student: Student<s_id=1,s_name=yuntuan>>
>>> s1.department
<Department: Department<d_id=5,d_name=IT>>
# 学院
# 学生
# 课程
# 成绩
可以通过外键属性获取和设置。对外键的修改不会保存到数据库中,直至调用 save()。
如果模型 1 有一个 ForeignKey,那么该 ForeignKey 所指向的模型 2 实例可以通过一个管理器 返回前面有 ForeignKey 的模型 1 的所有实例。
默认情况下,这个 管理器 的名字为 foo_set,其中 foo 是源模型的小写名称。
# 例如:Student 模型改成
department = models.ForeignKey('Department', related_name='student'),那么实例代码改成这样
add(obj1, obj2, ...)
添加的已经存在数据库的数据
添加指定的模型对象到关联的对象集中。(一对多,多对多)
create(**kwargs)
添加不存在的数据,将数据直接存入数据库,创建一个新的对象,将它保存并放在新创建的对象。(一对一,多对多)
remove(obj1, obj2, ...)
从关联的对象集中删除指定的模型对象。(多对多)
删除的是关系表中的数据
clear()
从关联的对象集中删除所有的对象。(多对多)
>>> s3.course.clear()
注意:
对于所有类型的关联字段,add()、create()、remove() 和 clear()都会马上更新数据库。在关联的任何一端,都不需要再调用 save() 方法。
直接赋值
②多表查询
Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理 JOIN。 若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:
这种跨越可以是任意的深度。
它还可以反向工作。若要引用一个“反向”的关系,只需要使用该模型的小写的名称。
当你基于 ManyToManyField 或反向的 ForeignKey 来过滤一个对象时,有两种不同种类的过滤器。考虑 Department/Student 关联关系 (一对多的关系)。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有