自己創建第三張表建立多對多關系
表的創建
# 老師表和學生表可以是一個多對多的關系,建表時可以手動建立第三張表建立關聯 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)
增刪改查的操作
# 增 直接通過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)
Django中方法創建多對多關系
表的創建
# 表的創建,創建一個班級和課程的多對多關系 # 通過django中的ManyToManyField創建多對多關系,字段放在兩個列中任意一個都可以 class Classes(models.Model): name = models.CharField(max_length=32, null=True) course = models.ManyToManyField('Course') class Course(models.Model): name = models.CharField(max_length=32, null=True)
增刪改查的操作
# 增 先要找到對應的班級或者課程對象 obj = models.Classes.objects.filter(id=4).first() # 找到之后通過建表時的course.add進行添加,要把課程id放在列表里打散傳進去 obj.course.add(1) # 增加一個 obj.course.add(*[2,3]) # 增加多個 # 刪 找到對象.建表時的屬性名.clear() 刪除所有 obj = models.Classes.objects.filter(id=4).first() obj.course.clear() # 重置(改),也是找到對象,通過.set()方法,里面放一個列表 obj = models.Classes.objects.filter(id=3).first() obj.course.set([1,2,3]) # 查 對於模型類中有ManyToManyField字段的表來說 res = models.Classes.objects.all() # 先查出所有的對象 for row in res: print(row.name) for i in row.course.all(): # row.course.all()就是每個班級對應的所有課程對象 print(i.name) #對於模型類中沒有ManyToManyField字段的表來說 res = models.Course.objects.all() # 也是先查出所有的對象 for row in res: print("===================") print(row.name) for i in row.classes_set.all(): # 每個學科對應的所有班級 print(i.name)
注:這兩種方法建立多對多關系都是可以的,分情況考慮用哪一個,如果表之間的關系簡單,
第三張表中不需要加入除兩張表id以外的字段可以用django創建但是如果表關系比較復雜,
並且,第三張表中還需要加入一些其他的字段,就需要用到我們自定義的多對多關系(
手動創建第三張表),可以自定制第三張表的結構