09-表关联对象及多表查询

表关联对象及多表查询

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()

原文地址:https://www.cnblogs.com/jun-1024/p/10699027.html