Расширение Пользовательского объекта в Django: наследование модели User или использование UserProfile?

Для расширения Пользовательского объекта с помощью пользовательских полей документы Django рекомендуют использовать UserProfiles. Однако согласно этому ответу на вопрос об этом приблизительно с одного года назад:

расширение django.contrib.auth.models. Пользователь также работает лучше теперь - начиная с рефакторинга кода наследования Django в моделях API.

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

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

16
задан Community 23 May 2017 в 11:53
поделиться

2 ответа

Я голосую за использование UserProfiles .

Я использую несколько сторонних приложений. И внешний ключ для пользователя всегда будет указывать на auth.models.User.

Пример:

class Article(models.Model):
    user = models.ForeignKey('auth.User') # instead of your CustomUser
    text = ....

И ваша пользовательская модель пользователя:

class CustomUser(User):
    timezone = models.CharField(max_length=50, default='Europe/London')

    # Use UserManager to get the create_user method, etc.
    objects = UserManager()

Что произойдет, если вы получите доступ к полю пользователя через экземпляр статьи? Это вызовет исключение:

u = a_article.user
u.timezone

AttributeError: 'User' object has no attribute 'timezone'

Может быть, это не ' Это проблема для вас, и вы не хотите избежать дополнительного запроса к БД. Но я бы использовал способ get_profile.

ОБНОВЛЕНИЕ Май 2013 г.

Начиная с Django 1.5 вы можете расширить модель пользователя по умолчанию или заменить полностью настроенной моделью.

ОБНОВЛЕНИЕ Ноябрь 2016 г.

Вышеупомянутое решение устарело, см. Комментарий от wim

8
ответ дан 30 November 2019 в 23:14
поделиться

Вот что говорит James Bennett в этой записи в блоге о наследовании моделей:

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

Поэтому я считаю, что лучшим вариантом будет использование внешнего приложения, например, некоторых компонентов Pinax или django-profiles (изначально созданного тем же Джеймсом Беннетом).

2
ответ дан 30 November 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: