Django-профили пользователей разных типов


У меня есть приложение Django, которое позволяет различным типам пользователей: фирмам, администраторам, внешним людям и т. д. Конечно, всем этим легко управлять с помощью системы аутентификации и групп по умолчанию.

Моя проблема заключается в том, что пользователи, принадлежащие к разным группам, будут иметь различную связанную информацию - например, фирмы должны будут предоставлять некоторую коммерческую информацию, которая не имеет смысла для частных пользователей. Следовательно, мне нужно прикрепить различные виды профилей, в зависимости от группа. (В моем приложении группы взаимоисключающие.)

К сожалению, Django позволяет прикрепить в качестве профиля только одну модель, и эта модель объявлена в settings.AUTH_PROFILE_MODULE. Внутренне, это извлекается методом User.get_profile(), который в основном просто считывает это значение и выполняет некоторые проверки, например, что модель действительно существует.

Я думал о подклассах User и переопределении метода get_profile(), чтобы он возвращал другую модель в зависимости от группы.

Существует ли более простой / чистый способ управления различными типами профилей?

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

1 13

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, например.