Для расширения Пользовательского объекта с помощью пользовательских полей документы Django рекомендуют использовать UserProfiles. Однако согласно этому ответу на вопрос об этом приблизительно с одного года назад:
расширение django.contrib.auth.models. Пользователь также работает лучше теперь - начиная с рефакторинга кода наследования Django в моделях API.
И статьи, такие как это размечают, как расширить модель User с помощью пользовательских полей, вместе с преимуществами (получающий свойства непосредственно от пользовательского объекта, а не через .get_profile ()).
Таким образом, я задавался вопросом, существует ли согласие по этой проблеме или рассуждает для использования один или другой. Или даже что в настоящее время думают команды Django?
Я голосую за использование 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
Вот что говорит James Bennett в этой записи в блоге о наследовании моделей:
Я готов поспорить, что, вероятно, 90% или более вещей, которые люди говорят, что хотят сделать с подклассами, можно было бы лучше реализовать, определив вместо этого связанную модель и связав ее с уникальным внешним ключом.
Поэтому я считаю, что лучшим вариантом будет использование внешнего приложения, например, некоторых компонентов Pinax или django-profiles (изначально созданного тем же Джеймсом Беннетом).