表关联对象及多表查询
01、关系表的数据操作
02、表关联对象的访问
03、多表查询
01、一对多(正向)
正向,如果一个模型有外键字段,通过这个模型对外键进行操作叫做正向
- 一对多(增)
-
- 通过属性复制
- 通过主键的方式
例子:方法一
例子:方法二
- 一对多(改)
- 一对多(删)
- 删 只有外键设置了null=True,你就可以通过赋值None来删除关系。
- 一对多(查)
- 查外键关联的数据 用法:filter(关联表的字段_被关联表=数据)
02、一对多(正向)
个模型如果被另外一个模型外键关联,通过这个模型对关联它的模型进行操作交错反向
查(被关联模型数据 . 关联模型名称的小写_set . 查询方法() )
通过管理器,默认管理器是,有外键的模型名称的小写加上_set(foo_set, foo是模型名称小写),通过这个管理器可以查询模型的实例,
在定义外键的时候,通过related_name 可以覆盖这个名称
增
- 通过add方法 ,可以添加多个
- 通过create方法
方法二、
删(删掉关系)
remove(obj1, obj2,boj3)
- clear() 清空,慎用
add,remove,clear 直接操作数据库
改 替换对象集
- set([s1, s2])
03、多对多
- 如果因为有额外字段,自定义了中间模型,我们需要通过中间模型的管理器,进行manytomany关系的创建和删除。
- 默认情况,跟一对多中的,add,create,remove,clear 用法一致。
- 唯一的区别是,多对多正向的时候,多对多字段就是个管理器。反向的时候,跟一对多的方向一致,也是在模型小写后面加上_set. 和一对多类似,一样可以通过定义related_name 可以覆盖这个名称
增
查
04、一对一
- 非常类似一对一字段,增删改查和普通字段没有什么区别。
- 反向的时候,使用模型的小写,也可以给related_name覆盖,这个就不是管理器,就是一个普通属性。
- 注意,一个被一对一管理的模型,它的实例,如果没有被分配关系。
- 举个例子:学生对象,没有分配一个学生详情对象。如果去取,会抛出异常,DoseNotExist
05、跨表查询
要跨越关系,只需要使用跨越模型的相关字段的字段名,以下划线分隔,直到达到你想要的字段为止。
例如:查询男生都报名了什么课程
```
res = Course.objects.filter(students__sex=1).distinct() # distinct() 作用是去重
```
这个关系要多深就有多深
例如:查询所有报名了 python 课程的学员
```
res = Student.objects.filter(course__name__contains='python') # contains 包含
```
例如:查询所有报名了python全栈课程,在django框架第7期班级的学员
```
res = Student.objects.filter(course__name='python全栈', grade__name='django框架', grade__num='7')
```
例如:学员报名了python课程的班级有哪些
```
res = Grade.objects.filter(students__course__name__contains='python').distinct()