假設有表的關系如下:

1 class Classes(models.Model): 2 name = models.CharField(max_length=32) 3 institute = models.CharField(max_length=32) 4 headteacher = models.ForeignKey("Teacher") 5 def __str__(self): 6 return self.name 7 class Teacher(models.Model): 8 name = models.CharField(max_length=32) 9 student_belong = models.ManyToManyField("Students") 10 def __str__(self): 11 return self.name 12 class Students(models.Model): 13 name = models.CharField(max_length=32) 14 class_belong = models.ForeignKey("Classes") 15 def __str__(self): 16 return self.name
簡單來說,就是老師和班級是一對多,和學生是多對多。
一對多
class_all = Classes.objects.all() class_one = Classes.objects.get(id=1)
得到了兩個對象,假設班級中有headteacher這樣的查詢為正向的查詢。
那么正向:
tea = class_one.headteacher.name all_class = class_all.values_list("id","name","headteacher__name")
tea是通過點的方式直接找到了相關聯的老師信息。通過values這種方式則是要用雙下划綫__。一般直接使用values結果是字典形式。
反向:指的是teacher是被關聯方里面沒有class字段。
teacher_one = Teacher.objects.get(id=1)
teacher_all = Teacher.objects.all()
all_class = teacher_all.values("name","classes__name") 這里class必須是小寫。
class_name = teacher_one.classes_set
反向的values里面在寫錯的時候會報錯並提示有幾個可選。得知有classes選項。雖然在models的Teacher類中沒有這個字段。
在使用點的時候也有所不同多出了下划線_set的用法。
多對多
有django自動生成多對多表的操作 (也可以自己寫)
author_list = models.Author.objects.values("id","name","m__name") # values 中直接寫關系 雙下划綫是表示m的name
print(author_list)
obj = models.Author.objects.get(id=1)
增加
obj.m.add(3)
obj.m.add(3,4)
obj.m.add(*[2,3])
刪除
obj.m.remove(3)
obj.m.remove(3,4)
obj.m.remove(*[2,3])
修改
obj.m.set([1,2,3]) # 有則覆蓋 無則增加
obj.m.clear()
反向
obj = models.Book.objects.get(id=2)
obj_author = obj.author_set # 拿到作者列表增刪改查一樣
自己寫的多對多關系表
1 class T_S(models.Model): 2 teacher_id = models.ForeignKey(Teacher) 3 student_id = models.ForeignKey(Student) 4 class Meta(): 5 unique_together = ( 6 ('teacher_id','student_id'),
7 )
其中meta是將這兩個變成聯合唯一。防止重復出現。
自己寫第三張關系表的優點在於所有的一對多的操作都可以用在多對多的表中。利於查詢等操作。