在 Django 中构建成员资格的正确方法是什么?

What is the correct way to structure membership in 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 关系并在团队和成员之间建立 "Membership" 模型,如下所示:

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

这样,对于 link 团队成员,我会 get_or_create 一个 Membership 实例。要删除或重新添加成员到团队,我会切换 is_active 标志,而不是 add()remove() ManyToMany 关系。

使用直接关系的团队中的 add()remove() 成员更容易出错,还是在中间 [=18] 上使用 get_or_create 更好=] 模型?

或者,是否正确且可以使用?

我认为你真正需要的是决定 -> 你需要 extra data on your M2M relationship 吗?因为你的中间模型就是这样。而且我发现它不太容易出错,它与 is_active 标志的主要区别在于,这为您提供了类似于过去会员资格的历史信息。你需要这些数据吗?如果你这样做 - 使用这种方法。如果你这样做只是因为你认为它不太容易出错,那么对我来说你正在解决错误的问题。