九.django模型基础(三)之关联对象操作及多表查询

时间:2022-08-13 05:32:31

Ⅰ.关系表的数据操作

1.正向

  正向:如果一个模型有外键字段,通过这个模型对外键进行操作叫做正向。

1)更新(增)  

      a.通过属性复制
      b.通过主键的方式

  总结: ForeignKey 字段的更新,跟普通字段没什么区别

a.实例(增加班级)

  九.django模型基础(三)之关联对象操作及多表查询

九.django模型基础(三)之关联对象操作及多表查询

九.django模型基础(三)之关联对象操作及多表查询

b.二次实例(与上同)

九.django模型基础(三)之关联对象操作及多表查询

九.django模型基础(三)之关联对象操作及多表查询

c.将某学生的数据转到另外的班级

九.django模型基础(三)之关联对象操作及多表查询

九.django模型基础(三)之关联对象操作及多表查询

2)删

  只有外键设置了 null=True ,就可以通过赋值None来删除关系。

a.删的实例

九.django模型基础(三)之关联对象操作及多表查询

九.django模型基础(三)之关联对象操作及多表查询

3)查

九.django模型基础(三)之关联对象操作及多表查询

2.反向

反向:一个模型如果被另外一个模型外键关联,通过这个模型对关联它的模型进行操作交错反向

1)查

通过管理器 ,默认管理器是有外键的模型名称的小写加上 set (形如: foo__set , 其中 foo 是模型名称小写 ),通过这个管理器可以查询模型的实例,在定义外键的时候,通过related_name 可以覆盖这个名称。

2)增

  a. 通过add方法 (可以添加多个) 直接操作
  b. 通过create方法

3)删

此处的删只是删掉关系

    a.通过 remove(obj1,obj2,obj3)                           直接操作
b.通过 clear() 清空 (将所有的关系删除)
4)改

替换对象集

  set([s1,s2])
5)实例
a.反向的一般情况

九.django模型基础(三)之关联对象操作及多表查询

b.管理器的特殊修改(关于查)

九.django模型基础(三)之关联对象操作及多表查询

九.django模型基础(三)之关联对象操作及多表查询

九.django模型基础(三)之关联对象操作及多表查询

c.管理器的特殊修改(关于增)

九.django模型基础(三)之关联对象操作及多表查询

九.django模型基础(三)之关联对象操作及多表查询

九.django模型基础(三)之关联对象操作及多表查询

d.管理器的特殊修改(关于删)

九.django模型基础(三)之关联对象操作及多表查询

九.django模型基础(三)之关联对象操作及多表查询

e.管理器的特殊修改(关于改)

九.django模型基础(三)之关联对象操作及多表查询

九.django模型基础(三)之关联对象操作及多表查询

Ⅱ.关系表的数据操作之(多对多)

  如果因为有额外字段,自定义了中间模型,我们需要通过中间模型的管理器,进行manytomany关系的创建和删除。一般地,默认情况,跟一对多中的,add,create,remove,clear用法一致。唯一的区别是,多对多正向的时候,多对多字段就是个管理器。反向的时候,跟一对多的方向一致,也是在模型小写后面加上 _set. 和一对多类似,一样可以通过定义 related_name可以覆盖这个名字。

1.实例

1)中间表的操作实例

九.django模型基础(三)之关联对象操作及多表查询

九.django模型基础(三)之关联对象操作及多表查询

2)多对多实例

九.django模型基础(三)之关联对象操作及多表查询

Ⅲ.关系表的数据操作之(一对一)

  非常类似于多对一字段,增删改查和普通字段没有什么区别。

  反向的时候,使用模型的小写,也可以给related_name覆盖,这个就不是管理器,就是一个普通属性。

  注意:一个被一对一管理的模型,它的实例,如果没有被分配关系、

    例子:学生对象,没有分配一个学生详情对象。如果去取,会抛出异常(DoesNotExist)

1.实例

九.django模型基础(三)之关联对象操作及多表查询

Ⅳ.多表查询(跨表查询)

  要跨越关系,只需要使用跨越模型的相关字段的字段名,以下划线分隔,直到达到你想要的字段为止。

    例如:查询男生都报名了什么课程

    res = Course.objects.filter(student__sex=1).distinct()

  这个关系要多深就有多深

    例如:查询所有报名了python课程的学员

    res = Student.objects.filter(course__name__contains='python')

    例如:查询所有报名了python全栈课程,在django框架第七期的学员

    res = Student.objects.filter(course__name='python全栈',grade__name='django框架',grade__num='')

    例如:学员报名了python课程的班级有哪些?

    res = Grade.objects.filter(students__course__name__contains='python').distinct()