2010-03-15 82 views
6

乾草我有一個關於關係的問題。django ManyToMany通過幫助

我想讓用戶有友誼。所以用戶可以成爲另一個用戶的朋友。我假設我需要通過友誼表使用ManyToManyField。但我無法實現它的工作。有任何想法嗎?

這是我的模特。

class User(models.Model): 
    username = models.CharField(max_length=999) 
    password = models.CharField(max_length=999) 
    created_on = models.DateField(auto_now = False, auto_now_add = True) 
    updated_on = models.DateField(auto_now = True, auto_now_add = False) 
    friends = models.ManyToManyField('self') 
    pendingFriends = models.ManyToManyField('self', through='PendingFriendship', symmetrical=False, related_name='friend_requested') 

class PendingFriendship(models.Model): 
    user = models.ForeignKey('User', related_name='user') 
    requested_friend = models.ForeignKey('User', related_name='requested_friend') 
    created_on = models.DateField(auto_now = False, auto_now_add = True) 
    updated_on = models.DateField(auto_now = True, auto_now_add = False) 

感謝

回答

6

許多一對多場在documentation描述。只要這樣做:

class User(models.Model): 
    username = models.CharField(max_length=999) 
    password = models.CharField(max_length=999) 
    created_on = models.DateField(auto_now = False, auto_now_add = True) 
    updated_on = models.DateField(auto_now = True, auto_now_add = False) 
    friends = models.ManyToManyField('self') 

如果您想爲關係添加額外的字段,則只需使用through即可。在this section中描述了所有可能性的另一種描述。

當你命名你的模型用戶,我假設你沒有使用構建認證框架。但是如果你使用它,你不必自己實現認證,所以想想看。

更新: 你看過我鏈接到的部分嗎?在那裏,它被描述:

有在中間模式中的一些限制:

  • 您的中間模型必須包含一個 - 且只有一個 - 外鍵目標模式(這是人在我們的例子)。如果您有多個外鍵,則會引發驗證錯誤。
  • 您的中間模型必須包含一個 - 且只有一個 - 源模型的外鍵(在我們的示例中,這將是Group)。如果您有多個外鍵,則會引發驗證錯誤。
  • 唯一的例外是一個模型,它通過一箇中介模型與自己有多對多的關係。在這種情況下,允許使用相同模型的兩個外鍵,但它們將被視爲多對多關係的兩個(不同)側。
  • 使用中間模型定義從模型到其自身的多對多關係時,必須使用symmetrical=False(請參閱model field reference)。
+0

我已更新了示例,並附有您的修改。不過,我仍然需要額外的表來保存數據。 – dotty

+0

@dotty:我更新了我的答案。 –

+1

嗯,我更新了我的模型,它通過驗證罰款。我添加了幾個用戶。並在用戶A的模型上創建了PendingFriendship對象。這增加了友誼,但是用戶b的對象並沒有得到友誼的另一面(因爲'對稱'值是假的,所以我們不認爲)。我希望這種關係是對稱的。有任何想法嗎? – dotty

0

This blog解釋你需要什麼。從博客,你只需要改變related_name在這一行:

pendingFriends = models.ManyToManyField('self', through='PendingFriendship', symmetrical=False, related_name='friend_requested') 

到:

related_name='friend_requested+' 

但是,我仍然無法得到它的工作自動創建的對稱關係。