У меня есть модель в django, в которой будет несколько ролей — обычный пользователь, админ и менеджер. Каждый из них сможет сделать что-то еще. Правильно ли работает следующая модель?
class Team(models.Model):
name = models.CharField('Name', max_length=128)
users = models.ManyToManyField(User)
admins = models.ManyToManyField(User)
managers = models.ManyToManyField(User)
def __str__(self):
return self.name
Это может сработать. Если количество ролей большое, или динамическое (т.к. роли можно добавлять, удалять, переименовывать, обновлять). Вы можете ввести тернарное отношение, например:
from django.conf import settings
class Role(models.Model):
name = models.CharField(max_length=128)
class Team(models.Model):
name = models.CharField('Name', max_length=128)
members = models.ManyToManyField(settings.AUTH_USER_MODEL, through='Membership')
def __str__(self):
return self.name
class Membership(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
team = models.ForeignKey(Team, on_delete=models.CASCADE)
role = models.ForeignKey(Role, on_delete=models.PROTECT)
Отличный ответ. Это создает так много возможностей и гибкости. Только лучше заменить user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE) в членстве на user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) согласно документам Django.