day102-django-ORM操作-多对多-自定义关联表
1.models.py
from django.db import models class Teachers(models.Model): name = models.CharField(max_length=32) class Classes(models.Model): title = models.CharField(max_length=32) #自定义关联表 class Teacher2Class(models.Model): teacher = models.ForeignKey('Teachers',on_delete=None) cls = models.ForeignKey('Classes',on_delete=None)
2.views.py from django.shortcuts import render,HttpResponse from app01 import models def test(request): # #添加老师姓名 # obj1 = [ # models.Teachers(name='小明'), # models.Teachers(name='小红'), # models.Teachers(name='小方'), # ] # #批量添加,每次最多5个 # models.Teachers.objects.bulk_create(obj1,5) # # #添加班级 # models.Classes.objects.create(title='全栈1期') # models.Classes.objects.create(title='全栈2期') # models.Classes.objects.create(title='全栈3期') # models.Classes.objects.create(title='全栈4期') # #关联表添加老师id和班级id # models.Teacher2Class.objects.create(teacher_id=1,cls_id=1) # models.Teacher2Class.objects.create(teacher_id=1,cls_id=2) # models.Teacher2Class.objects.create(teacher_id=2,cls_id=2) # models.Teacher2Class.objects.create(teacher_id=2,cls_id=4) # models.Teacher2Class.objects.create(teacher_id=3,cls_id=4) # models.Teacher2Class.objects.create(teacher_id=3,cls_id=3) #查询小明老师教哪几个班级,有4种方法: #推荐使用第四种方法,第一二种方法每循环一次就发一次查询请求,拖慢速度。 #1.从Teacher2Class表中过滤出连表的姓名是小明的行列表,teacher、cls是外键 row_list = models.Teacher2Class.objects.filter(teacher__name='小明') for row in row_list: print(row.cls.title)#该行连表找到班级 #2.从Teachers表中过滤出姓名是小明的行 obj = models.Teachers.objects.filter(name='小明').first() #找到该行跟关联表对应的行列表 row_list = obj.teacher2class_set.all() for row in row_list: print(row.cls.title) #3.从Teacher2Class表中过滤出连表的姓名是小明的行,并且找到连表名是title的字典列表 dic_list = models.Teacher2Class.objects.filter(teacher__name='小明').values('cls__title') for row in dic_list: print(row['cls__title'])
# id teacher_id cls_id cls__title
# 1 1 1 全栈一期
# 2 1 2 全栈二期
#4.从关联表Teacher2Class中过滤出连表名是小明的行,并且通过外键cls连接上Classes表 row_list = models.Teacher2Class.objects.filter(teacher__name='小明').select_related('cls') for row in row_list: print(row.cls.title) return HttpResponse('...')