构建Django成员资格的正确方法是什么?
假设我有一个包含团队和成员的网站。我有一个团队模型和模型成员:构建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
关系,使团队和成员之间的“会员制”的模式,像这样:
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
?
或者,要么正确和罚款使用?
我认为你真正需要的是决定 - >你需要一个extra data on your M2M relationship?因为你的中间模型就是这样。我无法找到它作为一个不太容易出错的地方,它的is_active
标志的主要区别在于,这给了你一些有关过去成员资格的历史信息。你需要这些数据吗?如果你这样做 - 采用这种方法。如果你只是因为你认为它不太容易出错,那么对于我来说你正在解决错误的问题。
“解决错误的问题”;这是OP方法的真正问题。 – 2015-02-24 04:59:54
我不太清楚你在这里问的是什么:'是否更容易出错'似乎是一个相当主观的问题。请注意,您可以通过将Membership作为'through'参数设置到ManyToManyField来结合这些方法。 – 2015-02-23 15:23:32
@DanielRoseman我听说在数据库级使用'add()'和'remove()'可能更容易出错,而不是简单地在中间模型上翻转一个标志?也许情况并非如此? – YPCrumble 2015-02-23 15:24:58