Как интегрировать различные типы пользователей в 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
Почему я так говорю?
Я сделал нечто похожее на то, что вы хотите сделать (все одинаковые поля для несвязанных типов пользователей в одной модели) в своем большом проекте около года назад и теперь жалею об этом. В результате мои модели стали менее чистыми и менее организованными.