Как расширить группы Django для динамических пользовательских типов? - PullRequest
2 голосов
/ 25 октября 2019

У меня есть проект SaaS, который будут использовать многие компании, и в компаниях будут сотрудники, которые будут работать в одной из двух групп: Супервизор или Не супервизор . Вероятно, это будет выглядеть так:

class EmployeeGroup(Group):
    ....

Каждая компания сможет создать свой собственный EmployeeType, который входит в один из EmployeeGroups. например, EmployeeType может быть Супервайзером по продуктам и напиткам , который является EmployeeGroup: Супервайзером :

class EmployeeType(models.Model):
    ....
    employee_type = models.CharField(
        max_length=32,
        default='Server'
    )
    employee_group = models.ForeignKey(
        EmployeeGroup,
        null=True
    )
    company = models.ForeignKey(
        Company,
        on_delete=models.CASCADE,
        null=True
    )

И, очевидно, каждый User будет иметьEmployeeType:

class User(AbstractUser):
    ....

    employee_type = models.ManyToManyField(
        EmployeeType,
        null=True,
    )

В этой ситуации несколько компаний могут совместно использовать EmployeeGroups без совместного использования EmployeeTypes? Меня беспокоит то, что если EmployeeType: Сервер будет создан в Компания A , то Компания B не сможет создать EmployeeType: Сервер . Или, что если они это сделают, то информация будет пересекаться. Было бы полезно иметь представление о том, как работает база данных, но я нет. Будем весьма благодарны за любые ссылки на внешние ресурсы, специфичные для данной ситуации!

1 Ответ

2 голосов
/ 25 октября 2019

Чтобы упростить и упростить ваши запросы к БД, вы можете добавить еще один столбец в таблицу вашей компании и писать в нем каждый новый employee_groups при приеме на работу нового сотрудника:

class Company(models.Model):
    ...
    employee_groups = models.ManyToMany(EmployeeGroup, null=True)


class User(models.Model):
    _job = models.ForegnKey(Company, null=True)
    employee_type = models.ManyToManyField(
        EmployeeType,
        null=True,
    )

    def __setattr__(self, attrname, val):
        if attrname == 'job' and isinstance(val, Company):
            val.employee_groups.add(self.employee_type.employee_group)
            self._job = val

Теперь, когда выназначит для какого-либо пользователя новую работу, и в компании, нанявшей его, будет добавлена ​​новая employee_group.

. После этого вы можете легко получить все employee_groups в любой компании по вашему желанию простым запросом:

employee = Users.objects.get(some_user_pk)
empoyer = Company.objects.get(some_company_pk)
employee.job = employer

print(empoyer.employee_groups)   # will contain employee_group of new employee
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...