2016-04-25 88 views
0

例如:在Django中,symmetrical = True會做什麼?

class Contact(models.Model): 
    contacts = models.ManyToManyField('self', through='ContactRelationship', symmetrical=False) 

什麼是symmetrical=False參數呢?

什麼時候應該保留爲True,什麼時候應該設置爲False

這個設置如何影響數據庫(它是否會創建額外的列等)?

+1

' symmetrical = True'導致爲兩個對象之間的單個關係創建兩行,因爲它是雙向的。例如:如果'A'是'B'的朋友,那麼'B'是'A'的朋友,所以我們需要朋友表中的兩個單獨的行,其中第一個將指示關係'A - > B'和第二個是'B - > A' – ozgur

回答

2

這裏是什麼在documentation說:

在自我ManyToManyFields的定義只使用。請看下面的模式:

from django.db import models 

class Person(models.Model): 
    friends = models.ManyToManyField("self") 

當Django處理這個模型,它識別出它有本身ManyToManyField,並作爲一個結果,它沒有一個person_set屬性添加到Person類。相反,ManyToManyField被假定爲symmetrical - 也就是說,如果我是你的朋友,那麼你是我的朋友。

默認情況下,symmetrical的值對多對多字段爲真,這是一個雙向關係。

使用通過表(對稱= FALSE):

但你也可以想像一個情況下,你不需要這種類型的關係,所以你可以添加symmetrical=False。而且,這可以通過使用一個通過表,因爲在默認情況下symmetrical實現是False如果通過表中使用:

使用中間模型

遞歸關係總是被定義爲非對稱的 - 也就是說,用symmetrical=False - 因此,存在「source」「target」的概念。在這種情況下,'field1'將被視爲關係的「source」,並將'field2'視爲「target」

所以你可以想象,你需要做的方向,即讓我們說有一個Node模型,它具有使用通過表本身的關係的情況。如果我們沒有這方面的要求,我們可以使用前面的示例。但是現在我們還需要從一個節點到另一個節點的方向,其中一個是source,另一個是target,並且由於這種關係的性質,它不能是對稱的。

+0

謝謝。爲了確認我是否正確理解了:如果ManyToManyField是對稱的,那麼它是否只需要Person.person_set中的所有內容並將其整合到Person.friends中?如果我理解正確,這是一個Django事物,而不是數據庫事物 - 我們可以在對稱True或False之間來回切換,而無需對數據庫遷移進行任何更改? – dtgq

+1

這完全是一個Django的東西,但遷移會發生,雖然它不會影響數據庫。它的行爲更像'空白'關鍵字,如果添加到字段將導致遷移,雖然它不直接與數據庫相關,但僅用於django表單。 – AKS

2

比方說,你有兩個聯繫實例,約翰和朱迪。你可以決定讓約翰成爲朱迪的聯繫人。這個動作是否也應該讓Judy成爲John的聯繫人?如果是這樣,symmetrical=True。如果沒有,symmetrical=False

+0

好吧我想我現在明白了。但是,第一列和第二列兩行翻轉的目的是什麼?如果'Judy.contacts'包含一個指向John的直通對象,那麼不能簡單地通過'John.contacts_set'這樣的東西來通過源自Judy的對象來獲得同樣的東西嗎?或者,再次瀏覽表格,將第1列如第2列,第2列如第1列那樣對稱化的效果? – dtgq

+0

我相信,如果您使用的是中介模式,即'through =',則必須設置'symmetrical = False'。無論如何,我並不確定,但我懷疑這些行在'symmetrical = True'時是否重複。請記住,有一個ORM將您的代碼與數據庫分隔開來;因此,該標誌更可能影響DB查詢的結構,而不是DB本身的結構。但我不是專家,所以也許別人會對此感到擔憂! – danyamachine