Расширение объекта User в Django: наследование модели пользователя или использование UserProfile? - PullRequest
16 голосов
/ 03 мая 2010

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

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

А в статьях, таких как this , рассказывается, как расширить модель User с помощью пользовательских полей, а также преимущества (получение свойств непосредственно из объекта пользователя, а не через .get_profile ()).

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

Ответы [ 2 ]

8 голосов
/ 03 мая 2010

Я голосую за использование 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()

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

u = a_article.user
u.timezone

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

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

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

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

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

Приведенное выше решение устарело, см. Комментарий от wim

2 голосов
/ 03 мая 2010

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

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

Так что я считаю, что лучше всего по-прежнему использовать внешнее приложение, такое как некоторые компоненты Pinax или приложение django-profile (первоначально от того же Джеймса). Bennett).

...