2011-05-10 106 views
0

我正在研究Django中某些模型的設計,並希望得到一些建議。我有一個團隊模型,許多用戶可以參與其中。用戶也可以是許多團隊的成員,但他們不能兩次成爲同一團隊的成員。我還想跟蹤每個團隊/用戶組合的單獨信息。最重要的是,每個團隊都會有一個「管理員」,但每個團隊可能只有一個管理員。我有一些凝結的數據模型定義如下:Django中的多對多關係

class Team(models.Model): 
    name = models.CharField() 
    members = models.ManyToManyField(User, through='Membership') 
    admin = models.ForeignKey(User) 

class Membership(models.Model): 
    user = models.ForeignKey(User) 
    team = models.ForeignKey(Team) 
    extra_data = models.CharField() 

所以我想我的兩個問題是:

1)我將如何讓這個在會員制模式,沒有用戶和團隊組合出現了較比一次?

2)有沒有更好的方式來表示團隊中的管理員,同時確保每個團隊只有一個?看起來如果我像這樣存儲管理員,同時強制只有一個管理員的規則,查詢所有團隊成員變得過於繁瑣,因爲管理員不會在Membership表中。如果它們存儲在成員資格中,則比我不得不執行另一個查詢來查看它們是否是該團隊的管理員。想到在會員中使用「is_admin」字段的想法突然出現在我的腦海中,但我不確定如何保持每個團隊1個管理員的約束。

任何幫助將不勝感激。

更新: 看起來像unique_together元標記是我正在尋找第一個問題。我還是很好奇,雖然第二個....

+0

我認爲你是正確的管理關係生活在團隊模式湖從關係的性質來看,這是最合適的地方。 QuerySet API可以讓你得到任何你想要的,通常只有最少數量的查詢。 – 2011-05-10 22:26:12

回答

1

第一個問題:

您可以添加一個約束,以防止它:

class Membership(models.Model): 
    user = models.ForeignKey(User) 
    team = models.ForeignKey(Team) 
    extra_data = models.CharField() 
    class Meta: 
     unique_together = (('user','team'),) 

第二個問題(S):

您可以添加排名字段到成員資格模型,並使'用戶'和'排名'unique_together,正整數字段。用戶rank == 1是管理員。或類似。它會執行你的方案,但編寫維護它可能會很麻煩。你可能會更好地利用你所擁有的東西。

+0

感謝您的幫助。當我看到你已經回答時,我剛剛完成了關於unique_together的編輯帖子。 – user417918 2011-05-10 22:06:10

0

迴應你的第二個問題:

爲什麼你不包括管理員在團隊的成員m2m?

當你想整個組隊包括admin:

some_team.members 

保持聯繫FK的團隊模式是有道理的,當你想管理員可以使用:

some_team.admin 

當你希望隊伍沒有你可以使用的管理員:

some_team.members.exclude(pk = some_team.admin.pk) 
+0

我唯一關心的是這種方法是如何強制執行,當一個團隊被創建​​並且一個管理員被添加時,他們也作爲一個成員被添加到團隊中。在團隊註冊頁面中,這很容易實施,但我有點擔心通過其他界面(如admin)創建的團隊不得不依賴用戶手動添加它們。 – user417918 2011-05-10 23:50:43

+0

也許這是覆蓋團隊的保存方法並自動添加管理員作爲第一個團隊成員的好地方? – user417918 2011-05-10 23:52:14