2012-04-23 60 views
1

閱讀時,Django會記錄多對多關係,當您需要中間表上的額外字段時,我不清楚您獲得了什麼通過將關係定義爲多對多而不是在每個模型中只有中間模型的外鍵。Django:多對多with through vs 2x一對多

例如,在這裏的例子:https://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany

爲什麼用ManyToManyField線煩惱呢?它是否允許您以任何不同的方式引用關係?它是否會更改管理員中的某些內容?

回答

1

何苦與ManyToManyField line:M2M領域是Django的fields這對於像ModelAdminModelForm多模場接口(聲明領域,不包括,默認的小部件)有用。它還生成幫助方法,如輕鬆訪問管理員中的m2m管理員和auto m2m保存。

下面是該領域爲管理面板自動執行的一個簡單示例:如果不先保存主對象,則無法保存直通模型。主對象自動保存後,管理員用save_m2m處理此行爲。如果你沒有使用m2m字段,你必須自己編寫這種邏輯。

我想你會在你的項目使用m2m字段時使用這個字段,但你只需要少量的附加信息。這樣,您的代碼幾乎與典型的m2m關係相同,但是當您需要它時,您可以查詢額外的信息。

否則,將單純的「DATE_ADDED」領域還需要編寫管理窗口小部件,save_model鉤,代表的ModelForm等

你是正確的,雖然這與移除M2M線通過模型不會做出任何數據庫的變化,你最終可以用默認的ForeignKey反向管理器替換m2mfield功能,而不會造成太大的傷害。

model.m2m_through_set.all() # this would work 
model.m2m_through_set.create(target=target_instance)