Django - Профили пользователей разных типов
У меня есть приложение Django, которое позволяет различным пользователям: фирмам, администраторам, внешним людям и т.д. Конечно, все это легко управлять с помощью системы и групп проверки подлинности по умолчанию.
Моя проблема заключается в том, что пользователи, принадлежащие к разным группам, будут иметь другую связанную информацию - например, фирмам необходимо будет предоставить некоторую коммерческую информацию, которая не имеет смысла для частных пользователей. Следовательно, мне нужно прикрепить разные профили в зависимости от группы. (В моих группах приложений взаимоисключающие.)
К сожалению, Django позволяет подключать только одну модель в качестве профиля, и эта модель объявляется в settings.AUTH_PROFILE_MODULE
. Внутренне это извлекается методом User.get_profile()
, который в основном просто считывает это значение и выполняет некоторые проверки, например, что модель действительно существует.
Я думал о подклассификации User
и переопределении метода get_profile()
, чтобы он возвращал другую модель в зависимости от группы.
Есть ли более простой/более чистый способ управления различными профилями?
То, что я предлагаю, кажется немного взломанным, учитывая, что пользовательские профили были введены точно, чтобы избежать необходимости подкласса User.
Ответы
Ответ 1
Создайте модель с OneToOneField
до User
и related_name
.
Е. г:.
class Firm(models.Model):
user = models.OneToOneField(User, related_name='firm')
# other fields
class External(models.Model):
user = models.OneToOneField(User, related_name='external')
# other fields
Затем вы можете проверить существование этих атрибутов в User
(if hasattr(request.user, 'firm')
) и вернуть соответствующий экземпляр. Я бы поместил его в обычное промежуточное ПО, которое установило бы request.user_profile
, например.