【问题标题】:How to manage memberships of clubs/teams (groups) and handle permissions in Django?如何管理俱乐部/团队(组)的成员资格并在 Django 中处理权限?
【发布时间】:2019-06-24 19:11:27
【问题描述】:

我正在创建一个 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. 我应该考虑其他方法吗?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    欢迎来到 StackOverflow。

    1) 团队成员身份看起来是一个很好的方法。我不确定name 字段将用于什么,但它看起来可能是多余的(来自团队名称或用户名)。

    2) 为权限实现组并不是一个坏主意。这样,您应用的安全部分就不再依赖于功能部分,反之亦然。

    3) 使用组实现django-guardians 权限的最佳方式是使用signals,每当创建或销毁TeamTeamMembership 实例时发送该signalsTeam 的创建/删除将导致相应权限组的创建/删除,TeamMembership 的创建/删除将导致在Team 权限组中添加/删除该人。

    【讨论】:

    • 非常感谢您的回答!我认为“名称”字段是我忘记从之前的迭代中删除的内容。我对一堆不同的东西进行了原型设计,并或多或少地在我开始的地方结束了。使用 Signals 是个好主意,我已经对它们进行了一些尝试,所以希望我能弄明白。再次感谢!
    猜你喜欢
    • 2021-09-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    相关资源
    最近更新 更多