django 一對多,多對多查詢

2022-06-26 22:12:20 字數 2423 閱讀 8932

假設有表的關係如下:

1

class

classes(models.model):

2 name = models.charfield(max_length=32)

3 institute = models.charfield(max_length=32)

4 headteacher = models.foreignkey("

teacher")

5def

__str__

(self):

6return

self.name

7class

teacher(models.model):

8 name = models.charfield(max_length=32)

9 student_belong = models.manytomanyfield("

students")

10def

__str__

(self):

11return

self.name

12class

students(models.model):

13 name = models.charfield(max_length=32)

14 class_belong = models.foreignkey("

classes")

15def

__str__

(self):

16return self.name

view code

簡單來說,就是老師和班級是一對多,和學生是多對多。

得到了兩個物件,假設班級中有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)

4class

meta():

5 unique_together =(

6 ('teacher_id'

,'student_id'

), 7

)

其中meta是將這兩個變成聯合唯一。防止重複出現。

自己寫第三張關係表的優點在於所有的一對多的操作都可以用在多對多的表中。利於查詢等操作。

Django之資料庫聯表查詢,一對多,多對多

from django.db import models create your models here.一對多 subject 和 學生 多對多 老師,學生 class subject models.model name models.charfield max length 32 price m...

表關係 一對一,一對多,多對多

可以在資料庫圖表中的表之間建立關係,以顯示乙個表中的列與另乙個表中的列是如何相鏈結的。更好的方法是將有關出版社的資訊在單獨的表,publishers,中只儲存一次。然後可以在titles表中放置乙個引用出版社表中某項的指標。為了確保您的資料同步,可以實施titles和publishers之間的參照完...

表關係 一對一,一對多,多對多

可以在資料庫圖表中的表之間建立關係,以顯示乙個表中的列與另乙個表中的列是如何相鏈結的。更好的方法是將有關出版社的資訊在單獨的表,publishers,中只儲存一次。然後可以在titles表中放置乙個引用出版社表中某項的指標。為了確保您的資料同步,可以實施titles和publishers之間的參照完...