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

У меня есть проблема, в которой я застрял уже несколько дней и не могу найти решение, которое становится очень неприятным.

В моих моделях у меня есть Companies. Каждая компания имеет 2 Group для аутентификации и авторизации: Супервизор и не Супервизор .

Из этих 2 Group будет несколько динамических подгрупп для каждой компании, которую я называю Employee Type. Эти EmployeeType могут быть созданы администратором компании на панели администратора, а затем назначены одному из Group s.

Подведем итог: каждый Company будет иметь 2 Groups. Каждый Group будет иметь неограниченное количество EmployeeType с. Каждый EmployeeType будет иметь неограниченное количество Users.

Несмотря на то, что Group одинаковы во всех компаниях, EmployeeType могут иметь одинаковое имя, но не должны быть доступны для совместного использования. между компаниями.

class Company(models.Model):
    ....

class EmployeeType(models.Model):
    ....
    employee_type = models.CharField(
        max_length=32,
        default='Server'
    )
    group = models.ForeignKey(
        Group,
        on_delete=models.CASCADE,
        null=True
    )
class User(AbstractUser):
    ....
    company = models.ForeignKey(
        Company,
        on_delete=models.CASCADE,
        null=True
    )
    employee_type = models.ForeignKey(
        EmployeeType,
        on_delete=models.CASCADE,
        null=True,
    )
  • Как я могу сделать так, чтобы Company A мог иметь свои собственные EmployeeType s, а Company B мог иметь свои EmployeeType s, но имяEmployeeType в обеих компаниях могут быть одинаковыми, при этом также следя за тем, чтобы Company A не видел Company B s EmployeeType s

Извинения, если это кажется очень простым, но я запутался, когдаEmployeeType с становятся динамическими. Когда я пытаюсь это сделать, у меня возникает круговая логика, и я не могу обернуть голову вокруг правильной структуры.

1 Ответ

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

Позвольте мне сразу ответить на ваши вопросы.

Это правильный способ моделирования создания динамического пользовательского типа? NO

Group/Supervisor должно быть BooleanField in EmployeeType. Это не обязательно должна быть отдельная модель и внешний ключ. Это значительно упростит ваши функции аутентификации и авторизации, поскольку, насколько я понимаю, они имеют только супервизор True / False

User должен иметь EmployeeType как ManyToManyField, так как вы можете добавить ПодробнееРоли / EmployeeTypes для Сотрудника в будущем.

Вам не нужно Company ForeignKey в Пользователе, так как об этом позаботятся через EmployeeType ManytoManyField Отношения

ДобавитьCompany ForeignKey в EmployeeType и поскольку вы будете удалять Group Foreign Key из Company, EmployeeType and User

Таким образом, ваши модели должны выглядеть следующим образом:

class Company(models.Model):
    ....


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


class User(AbstractUser):
    ....

    employee_type = models.ManyToManyField(
        EmployeeType,
        null=True,
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...