В настоящее время я создаю структуру, в которой у меня есть сотрудники, принадлежащие компании. Внутри этой компании мне нужно создать несколько групп. Ранги, если хотите. Вы можете назначить меньше разрешений для более низких рангов и больше разрешений для более высоких рангов.
Я хочу пойти на разрешения уровня объекта, и я заметил, что проект django-guardian дал мне именно то, что мне нужно. Он работает с собственными объектами User и Group, поэтому теперь я пытаюсь найти способ реализовать объект родной группы в объекте компании.
Я сталкиваюсь с тем, что имя в группе уникально. Поэтому, если 2 компании добавят одну группу, будут возникать ошибки.
Я нашел реализацию, которая работает в некотором смысле, но кажется довольно "взломанной" для меня. В моей компании я объявила групповую переменную, которая ссылается на группу:
class Company(models.Model):
...
groups = models.ManyToManyField(Group, through='CompanyRole')
КомпанияRole в основном содержит название группы и ссылку на компанию и группу
class CompanyRole(models.Model):
group = models.ForeignKey(Group)
company = models.ForeignKey(Company)
real_name = models.CharField(max_length=60, verbose_name=_('Real name'))
objects = CompanyGroupManager()
Я создал пользовательский менеджер с удобным методом для добавления новой "группы компаний"
class CompanyGroupManager(models.Manager):
def create_group(self, company, group_name):
un_group_name = str(company.id) + '#' + group_name
group = Group.objects.create(name=un_group_name)
company_group = self.model(
real_name=group_name,
company=company,
group=group
)
company_group.save(using=self._db)
return company_group
Вот часть, на которую я действительно не чувствую себя комфортно. Чтобы изменить проблему с уникальным именем в модели Group, я использовал комбинацию идентификатора компании, символа хэша и фактического имени группы, чтобы избежать столкновений.
Теперь мой вопрос: есть ли в моем сценарии лучшие методы, я что-то упускаю или это хороший способ выполнить то, что мне нужно?