如何管理俱乐部/团队(组)的成员资格并处理Django中的权限?

时间:2019-06-24 19:11:27

标签: django django-models

我正在创建一个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", 
    )

总结我的问题:

  1. “ TeamMembership”模型是否是将用户与 团队?
  2. 我应该在模型中包含组以容纳以下用户吗? 权限目的,否则会引起问题吗?
  3. 还有其他我应该考虑的方法吗?

1 个答案:

答案 0 :(得分:0)

欢迎使用StackOverflow。

1)团队成员资格看起来是一种很好的方法。我不确定name字段的用途,但看起来可能是多余的(来自团队名称或用户名)。

2)实施权限组并不是一个坏主意。这样,您应用程序的安全性部分就不会依赖功能性部分,反之亦然。

3)对组实现django-guardians权限的最佳方法是使用signals,该Team在创建或销毁TeamMembershipTeam实例时发送。 TeamMembership的创建/删除将导致相应权限组的创建/删除,Team的创建/删除将导致该人在{{ 1}}权限组。