关联添加和查询
多对多增删改查
-
添加
# 案例,给某个人添加课程 操作第三张表 stu = Student.objects.get(name="张三") # 首先给哪个人添加课程查出来,他会返回一个模型类对象 c1 = Course.objects.get(title="python") # 将要插入的数据查出来 c2 = Course.objects.get(title="sql")# 将要插入的数据查出来 stu.courses.add(c1,c2) # 添加courses 是在Student这个模型类里面创建多对多关系的时候变量 只要是拿到Student对象就可以添加 # 方式2 stu = Student.objects.get(name="李四") stu.courses.add(4,5) # 直接写要添加的ID也可以stu.courses.add(*[4,5])
-
删除
# 删除多个可以使用*[] 和添加相同 stu = Student.objects.get(name="张三") stu.courses.remove(2) # 删除 # 清除 会将wangwyu 的第三张表的关联数据全部删除 stu = Student.objects.get(name="wangwyu") stu.courses.clear()
-
重置
# 会将之前的第三张表的数据全部删除 stu = Student.objects.get(name="张三") stu.courses.set([1,2,3]) # set 他会将之前的对应数据删除 将这次传入的数据更新进去
-
查
- 正向查询
stu = Student.objects.get(name="张三") for x in stu.courses.all(): # 返回一个query set对象 里面嵌套关联表的模型对象 print(x.title)
- 反向查询
cla = Course.objects.get(title="近代史") ret = cla.student_set.all() # student_set 是表名加上_set _set是固定的 只要是可以查出多个的时候都要加set 也可以使用 related_name print(ret)
- 正向查询
关联查询
下面这两种方式都分为正向查询和反向查询,正向查询就是通过关联属性查询 反过来就叫反向查询,反向查询依赖表名_set,_set是固定写法 必须在表名后面加上_set 或者是related_name,一对多会拼上_set 一对反向查询不会拼_set
基于对象的查询
- 正向查询
stu = Student.objects.get(name="张三") # 首先去查某个数据 他会返回模型类对象 print(stu.clas.name) # clas 是模型里面做关联的那个变量对象也可以说是clas的模型对象
- 反向查询
- 依赖表名反向查询
cla = Clas.objects.get(name="语文") ret = cla.student_set.all() # 返回一个query set集合对象 表名小写(也就是模型类名)后面固定加上_set,一对一反向查询不会加_set print(ret)
- 通过related_name
# .ForeignKey(elated_name="student_list") 在模型类绑定的时候在ForeignKey中加上related_name值随便起 在查的时候就可以使用返回的模型类对象.related_name的名称进行查询了 cla = Clas.objects.get(name="计算机科学与应用1班") ret = cla.student_list.all() # 反向查询 返回一个query set集合 里面嵌套模型类对象 print(ret)
- 依赖表名反向查询
基于双下划线的查询join
-
一对多
-
正向跨表查询
# 将Student作为基表 stu = Student.objects.filter(age__gt=22).values("name","clas__name") # clas__name clas是要跨表查询的对象名称 就是绑定时候的变量名称__后面就是要去的字段名称 print(stu)
-
反向跨表查询
# 将Clas作为基表student_list是related_name名后面就是要根据哪个字段过滤和过滤条件 stu = Clas.objects.filter(student_list__age__gt=22).values("name","student_list__name") # values("name","student_list__name") 获取Clas的那么以及 student_list的name print(stu)
-
-
多对多
-
正向跨表查询
# 将Student作为基表 查询张三学了那些课程 stu = Student.objects.filter(name="张三").values("name","courses__title") # courses 是绑定多对多的对象名 print(stu)
-
反向跨表查询
# 将Course作为基表 查询那些学生在学python stu = Course.objects.filter(title="python").values("title","stu__name") print(stu)
-
-
一对一
-
正向跨表查询
# 将Student作为基表 查询张三的手机号 stu = Student.objects.filter(name="张三").values("name","stu_detail__tel") print(stu)
-
反向跨表查询
# 将Course作为基表 查询13555555这个手机号是谁的 stu = StudentDetail.objects.filter(tel="13555555").values("tel","stu_detail__name") print(stu)
-
连续跨表查询
stu = StudentDetail.objects.filter(tel="110").values("stu_detail__name","stu_detail__clas__name")
print(stu)