##自己创建第三张表建立多对多关系
# 老师表和学生表可以是一个多对多的关系,建表时可以手动建立第三张表建立关联 class Student(models.Model): name = models.CharField(max_length=32, null=True) age = models.CharField(max_length=32, null=True) class Teacher(models.Model): name = models.CharField(max_length=32, null=True) gender = models.CharField(max_length=32, null=True) # 建立第三张表,把前两张表关联起来 class TeacherToStudent(models.Model): stu = models.ForeignKey('Student', null=True) teac = models.ForeignKey('Teacher', null=True) class Meta: #联合唯一索引 unique_together = [ ('stu','teac'), ]
##增删改查操作
# 增 直接通过models.类名.objects.create进行添加 models.Student.objects.create(name="xxx",age=12) models.Teacher.objects.create(name="ooo",gender="男") models.TeacherToStudent.objects.create(stu_id=1, teac_id=1) # 删 找出对象.delete() ,并且把对应关系也删了 models.Teacher.objects.filter(id=4).delete() models.TeacherToStudent.objects.filter(teac_id=4).delete() # 改 一样不同的表分开操作 models.Teacher.objects.filter(id=3).update(name="xoxo") # 查 ,如果我想查询一个学生同时被多少个老师教,有图下三种方法 # 1: res = models.Student.objects.filter(id=2).all() # 先查出符合条件的学生 for row in res: print(row.name) r = row.teachertostudent_set.all() # (反查)表示第三张表中所有学生id为2的行 for i in r: # i.teac # (正查)表示对应的老师表里的一列 print(i.teac.name) # 查出学生id为2对应的所有老师 # 2: res = models.TeacherToStudent.objects.filter(stu__name="cao").all() # 查出来的是学生名字为cao对应的所有的行(神奇的双下划线) for row in res: print(row.stu.name, row.teac.name) # 找到学生和老师的对应关系 # 3: res = models.TeacherToStudent.objects.filter(stu__name="li").values("teac__name") # 查出来的QuerySet 列表,里面包含字典 print(res)