Как интегрировать различные типы пользователей в djando UserModel?

У меня есть вопрос по поводу модели пользователя в django. Мой проект заключается в реализации системы управления территорией.

Следующие сущности уже смоделированы:

  • Здание
  • Зона
  • Оборудование зоны (например, какая мебель и т.д.)
  • SpaceUser (назначение между пространством и пользователем)
  • SpaceRequirement (запрос от пользователя)
  • Users (те, кто был, есть и будет в пространстве)
  • Supervisor (пользователь, отвечающий за определенные зоны или здания)
  • Тип использования (например, офис, лаборатория и т.д.)
  • Organization (организационная принадлежность к команде/отделу и т. д.)
  • Арендодатель

В качестве особого случая управление местами в мастерских, которые могут быть забронированы в кратчайшие сроки, осуществляется следующими подразделениями:

  • WorkshopSpace (помещение x в здании y)
  • WorkshopSpaceRequirement (запрос от пользователя)

Атрибутами сущностей являются: Supervisor firstname = models.CharField(max_length=100) lastname = models.CharField(max_length=100) organization = models.ForeignKey('Organization', verbose_name='Organization', on_delete=models.CASCADE) email = models.EmailField(verbose_name='Email') phone_number = models.CharField(max_length=20)

Users: organization = models.ForeignKey('Organization', verbose_name='Organization', on_delete=models.CASCADE) firstname = models.CharField(max_length=100) lastname = models.CharField(max_length=100) mgmt_level = models.CharField(max_length=10, choices=CATEGORY_CHOICES, default=E4, verbose_name='Level') cost_center = models.CharField(max_length=50, blank=True) number_employees = models.IntegerField(default=0, verbose_name='Number of employees') number_workstations = models.IntegerField(default=0, verbose_name='Number of workstations') superior = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True) comment = models.TextField(blank=True)

К сожалению, я совершил ошибку, реализовав модели без учета модели пользователя django. Теперь я хотел бы исправить это, используя CustomUser (наследует AbstractUser).

Мои текущие вопросы:

  • Могу ли я интегрировать две сущности user и supervisor со всеми их атрибутами в CustomUser?
  • Как работает последующее управление пользователями в django, например, в случае, если я создаю пользователей как суперпользователь, а они назначаются реальному пользователю только позже?

Заранее большое спасибо!

Быстрый ответ

Ваш первый вопрос

Да, вы сможете объединить все поля для двух типов пользователей в рамках одной модели пользователя при условии, что вы сделаете любое поле, которое может быть у одного типа пользователя, но не у другого, необязательным (вы также, конечно, оставите только одно поле для полей, которые есть у обоих типов пользователей).

Вы делаете поля необязательными, указывая null=True, blank=True; вам нужно и то, и другое, а не только blank=True (null=True позволяет вашей базе данных хранить нулевое значение для этого поля, а blank=True позволяет вашим формам, полученным из этой модели, не требовать этого поля).

Ваш второй вопрос

Не совсем понимаю, что вы имеете в виду под "эти [предполагаю, что под "этими" вы подразумеваете суперпользователей] назначаются реальному пользователю только позднее", но думаю, вы имеете в виду создание отношений между двумя моделями пользователей.

Я, вероятно, сделаю это, просто предоставив моей модели CustomUser (или модели профиля, подробнее об этом ниже) поле ForeignKey "назначенный пользователь", которое соединяется обратно с моделью CustomUser ( этот вопрос на StackOverflow расскажет вам, как создать поле ForeignKey для себя).

Лучший способ?

Если бы я делал это сам, то вместо того, чтобы запихивать все эти поля в одну модель CustomUser, я бы

  • создайте поле категории для моей модели CustomUser (используя TextChoices или IntegerChoices), чтобы обозначить, к какому типу пользователей относится любой объект CustomUser
  • .
  • затем создайте две отдельные "профильные" модели (например, SupervisorProfile и UnderlingProfile), в которые будут помещены все перечисленные вами поля (и будущие поля, которые вы придумаете).
    • Я бы поместил поля, которые оба типа пользователей не разделяют в эти отдельные модели профиля
    • .
  • связывать эти модели профилей с моделью CustomUser с помощью необязательных полей ForeignKey

Почему я так говорю?

Я сделал нечто похожее на то, что вы хотите сделать (все одинаковые поля для несвязанных типов пользователей в одной модели) в своем большом проекте около года назад и теперь жалею об этом. В результате мои модели стали менее чистыми и менее организованными.

Вернуться на верх