2014-06-10 33 views
1

簡明問題:
哪些建模在Django上的外部表一個多到多的關係(1.5)的優點和缺點,而無需使用參數?原因「到」參數在Django爲使用的M2M關係

詳情:
說,我有一個自定義用戶模型用戶配置,我想定義一個M2M關係到相同型號,例如實施以下關係。我可以定義一個外部表(模型)like so

class Relationship(models.Model): 
    """Relationship model""" 
    from_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='from_users') 
    to_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='to_users') 
    created = models.DateTimeField(auto_now_add=True) 
    is_blocked = models.BooleanField(default=False) 
    objects = RelationshipManager() 

在這種情況下我應該在M2M字段添加到用戶配置模型如下面顯示?如果是,爲什麼?我可以處理所有隻能使用關係模型用戶之間的關係,是不是?

class UserProfile(AbstractBaseUser, PermissionsMixin): 
    user_following = models.ManyToManyField('self', through=Relationship, symmetrical=False, related_name='followed') 

回答

1

首先,在數據庫中區分概念數據模型(CDM)和物理數據模型(PDM)很重要。

從概念上講,如果你想要一個用戶配置鏈接到其他用戶配置,看來你需要2個實體。

但在技術上(物理),因爲你要創建一個多對多的關係,你的系統絕對需要創建第三個數據庫來存儲2下的UserProfiles之間的關係,否則就不可以!

需要注意的是,如果它是一個OneToOne或一對多的關係,從技術上說,2臺就足夠了(這可以解釋爲什麼這個關鍵字只存在與多對多的關係)。

現在,明白的Django試圖讓您的生活更輕鬆:有可能,你不關心的「物理」層。例如,如果您只想知道哪個用戶連接到哪個其他用戶,而沒有附加信息。

- >在這種情況下,你不關心的第三個表,這只是一個技術性的約束,使您的整個東西的工作! through關鍵字不需要使用。 在這種情況下,您在Django中只能看到2個模型,但在數據庫中有3個表,即使您在Django中看不到它。

但在某些情況下(實際上經常),你可以使用這個第三個表上添加用戶之間的關係的重要信息。例如,如果要存儲創建關係的日期,則此第三個表格是完美的地方。

- >這種「技術性」表變成了「功能性」表格:你想,因爲它現在包含你除了你的用戶之間的關係的數據需要在項目中直接使用它! 這是使用through關鍵字在你的Django項目來定義這個第三個表,和屬性(如assocation_date)添加到這個模型/表中的時間。 現在,您在Django中有3個模型,並且數據庫中仍有3個表格(以及添加的其他屬性)。

另一個典型例子

客戶端可以訂購1-> N個乘積。產品可以由0-> N個客戶訂購。這顯然是一個ManyToMany Relashionship。

如果我想存儲有關訂單的信息(如總價格,日期等),我可以在定義客戶和產品之間的M2M關係時設置through="Order"。 然後,我在Django中定義了Order模型,並且賓果!使用

+0

是的,好,我知道這一點,問題是:如果我使用已定義的M2M(關係)的外部表而不將它鏈接一個m2m字段和「through」參數?優點缺點? – Leonardo

+0

我想你不應該那樣做。如果你爲自己定義了一個表,你應該告訴Django使用它。如果你不知道,Django應該如何知道他必須用它來建立關係?爲了回答你的問題,我沒有看到任何優勢(也許有,但告訴我^^),只有缺點:爲M2M所做的所有Django機制都不能自動工作。 –