假设我有一个包含团队和成员的网站。我有一个团队模型和一个成员模型:
class Team(models.Model):
name = CharField()
class Member(models.Model):
name = models.CharField()
team = models.ManyToManyField(Team)
在此关系中,Team
和Member
使用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()
成员是否更容易出错?或者在中间get_or_create
上使用Membership
会更好模型?
或者,使用是正确还是罚款?
答案 0 :(得分:1)
我认为你真正需要的是决定 - >你需要extra data on your M2M relationship吗?因为你的中间模型就是这样。而且我发现它不容易出错,与它的is_active
标志的主要区别在于它为您提供了类似过去成员资格的历史信息。你需要这些数据吗?如果你这样做 - 采用这种方法。如果你只是因为你认为它不那么容易出错,那么对我来说你就是在解决错误的问题。