問題描述
class ProjectUser(models.Model):
""" 項目參與者 """
user = models.ForeignKey(verbose_name='參與者', to='UserInfo')#項目參與者可以是多個用戶
project = models.ForeignKey(verbose_name='項目', to='Project')#一個參與者會參加多個項目
star = models.BooleanField(verbose_name='星標(biāo)', default=False)
create_datetime = models.DateTimeField(verbose_name='加入時間', auto_now_add=True)
- 這里的用戶表與項目明顯是多對多的關(guān)系命斧,按道理我們可以使用django model的m2m來解決,為什么在這里多手動定義了這張表灸叼?
答疑
-
如果第三張表只需要用戶和項目的id,那么我們就只需要在任意一張表使用m2m即可讓django自動幫我們創(chuàng)建一張表。下圖就是那我們在項目表里面的實例:
image.png - 但是如果除了項目和用戶id蜜另,還有其它的字段,那么就要自己手動創(chuàng)建第三張表嫡意。
through關(guān)鍵字
-
讓自己手動創(chuàng)建的和自動創(chuàng)建的進(jìn)行匹配共存举瑰。
image.png
我們可以加上m2m,但是在django自動生成的時候我們就給他手動指定一張已有的表蔬螟,并指定它參照的鍵字段此迅。也就是我們手動創(chuàng)建的表,這樣django就會按照我們的要求來定義第三張表旧巾,而不會自己自動生成第三張表耸序。
但其實用處不大,只是方便了查詢而已鲁猩!
-
如果一定要用坎怪,請注意through_filed里面的順序,由于是在project里面廓握,所以project要放在元組的第一位搅窿!對應(yīng)的第三張表也要把project放到第一位嘁酿,不然會報錯!
image.png