在 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)
在这个关系中,Team
和 Member
使用 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
标志的主要区别在于,这为您提供了类似于过去会员资格的历史信息。你需要这些数据吗?如果你这样做 - 使用这种方法。如果你这样做只是因为你认为它不太容易出错,那么对我来说你正在解决错误的问题。
假设我有一个包含团队和成员的站点。我有一个团队模型和一个成员模型:
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
关系并在团队和成员之间建立 "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
标志的主要区别在于,这为您提供了类似于过去会员资格的历史信息。你需要这些数据吗?如果你这样做 - 使用这种方法。如果你这样做只是因为你认为它不太容易出错,那么对我来说你正在解决错误的问题。