我正在创建一个Django项目,以帮助人们管理俱乐部和社区团体。我是Django的新手,我可以想到许多将用户添加到俱乐部并管理权限的不同方法,但是尚不清楚正确的方法是什么。
我有一个“俱乐部”模型和一个“团队”模型。俱乐部可以有很多团队,俱乐部的成员可以是也可以不是团队的成员,但是用户必须是俱乐部的成员才能加入团队。俱乐部/团队成员可以做什么和不能做什么(以及俱乐部/团队管理员可以做什么)也将有各种权限。
我目前用于管理成员资格的计划是创建“ ClubMembership”和“ TeamMembership”模型,并使用ManyToManyField.through创建关系,如下所示:https://docs.djangoproject.com/en/2.2/ref/models/fields/#django.db.models.ManyToManyField.through
对于权限,看来我应该使用django-guardian并在人们加入/离开俱乐部/团队时设置权限。在俱乐部/团队模型中对django.contrib.auth.models.Group也具有“成员”外键来进行跟踪是否有意义?
感觉好像我在某些方面加倍了,方法是由成员资格模型管理成员资格,然后使用组来设置权限。有没有更好的方法来解决这个问题,或者我应该修改/考虑的任何事情?
class Team(models.Model):
# Fields
name = models.CharField(max_length=255)
# Relationship Fields
club = models.ForeignKey(
'organizations.Club',
on_delete=models.CASCADE, related_name="teams",
)
members = models.ManyToManyField(
'organizations.Users.user',
related_name="teams", through='TeamMembership', through_fields=('team', 'user')
)
administrators = models.OneToOneField(
Group,
on_delete=models.CASCADE, related_name="teams",
)
class TeamMembership(models.Model):
# Fields
name = models.CharField(max_length=255)
# Relationship Fields
team = models.ForeignKey(
'organizations.Team',
on_delete=models.CASCADE, related_name="teammemberships",
)
user = models.ForeignKey(
'users.User',
on_delete=models.CASCADE, related_name="teammemberships",
)
总结我的问题:
答案 0 :(得分:0)
欢迎使用StackOverflow。
1)团队成员资格看起来是一种很好的方法。我不确定name
字段的用途,但看起来可能是多余的(来自团队名称或用户名)。
2)实施权限组并不是一个坏主意。这样,您应用程序的安全性部分就不会依赖功能性部分,反之亦然。
3)对组实现django-guardians
权限的最佳方法是使用signals
,该Team
在创建或销毁TeamMembership
或Team
实例时发送。 TeamMembership
的创建/删除将导致相应权限组的创建/删除,Team
的创建/删除将导致该人在{{ 1}}权限组。