2015-02-23 51 views
1

假設我有一個包含團隊和成員的網站。我有一個團隊模型和模型成員:構建Django成員資格的正確方法是什麼?

class Team(models.Model): 
    name = CharField() 

class Member(models.Model): 
    name = models.CharField() 
    team = models.ManyToManyField(Team) 

在這種關係中,TeamMember使用的是ManyToManyField(成員可以有一個以上的團隊)直接相關。

這意味着,我添加和刪除團隊成員認爲,像這樣:

team.objects.add(member) # Add a member to a team 
team.objects.remove(member) # remove a member from a team 

另一種方法是去除ManyToMany關係,使團隊和成員之間的「會員制」的模式,像這樣:

class Membership(models.Model): 
    is_active = BooleanField(default=True) 
    team = models.ForeignKey(Team) 
    member = models.ForeignKey(Member) 

通過這種方式,將成員鏈接到一個團隊我會get_or_create一個Membership實例。要刪除或重新添加該成員到團隊,我會切換is_active標誌,而不是add()remove()ManyToMany的關係。

是不是更容易出錯使用直接關係到從團隊add()remove()成員,或者是它更好地在中間Membership模型使用get_or_create

或者,要麼正確和罰款使用?

+0

我不太清楚你在這裏問的是什麼:'是否更容易出錯'似乎是一個相當主觀的問題。請注意,您可以通過將Membership作爲'through'參數設置到ManyToManyField來結合這些方法。 – 2015-02-23 15:23:32

+0

@DanielRoseman我聽說在數據庫級使用'add()'和'remove()'可能更容易出錯,而不是簡單地在中間模型上翻轉一個標誌?也許情況並非如此? – YPCrumble 2015-02-23 15:24:58

回答

2

我認爲你真正需要的是決定 - >你需要一個extra data on your M2M relationship?因爲你的中間模型就是這樣。我無法找到它作爲一個不太容易出錯的地方,它的is_active標誌的主要區別在於,這給了你一些有關過去成員資格的歷史信息。你需要這些數據嗎?如果你這樣做 - 採用這種方法。如果你只是因爲你認爲它不太容易出錯,那麼對於我來說你正在解決錯誤的問題。

+0

「解決錯誤的問題」;這是OP方法的真正問題。 – 2015-02-24 04:59:54

相關問題