Все это на первый взгляд похожие способы обратиться к модели пользователя, но между ними есть ряд различий.
1. User
# your_app/models.py from django.db import models from django.contrib.auth.models import User # (!) class YourModel(models.Model): title = models.CharField(max_length=255) author = models.ForeignKey(User, on_delete=models.CASCADE) # usage
Это прямое обращение к пользовательским моделям в Django и вы можете использовать его без проблем. Но разработчики фреймворка не рекомендуют так делать:
If you’re starting a new project, it’s highly recommended to set up a custom user model, even if the default User model is sufficient for you. This model behaves identically to the default user model, but you’ll be able to customize it in the future if the need arises.
Если вы создаете новый проект, то мы настоятельно рекомендуем создать собственную модель пользователя, даже если вам достаточно стандартной пользовательской модели. Эта модель ведет себя идентично пользовательской модели по умолчанию, но вы сможете настроить ее в будущем, если возникнет необходимость.
2. AUTH_USER_MODEL
Именно её рекомендуют использовать разработчики в models.py
.
Предположим вы создали application с названием users
и переопределили базовую пользовательскую модель:
# users/models.py from django.contrib.auth.models import AbstractUser class User(AbstractUser): pass
Далее вам надо будет добавить настройку AUTH_USER_MODEL
в settings.py
вашего проекта.
# settings.py AUTH_USER_MODEL = 'users.User' # обратите внимание что путь к модели указывается именно так
Даже если ваше приложение с переопределенными моделями лежит где-нибудь в /apps/users
, не важно. Запись должна быть заданного формата.
Таким образом её использование в будет происходить через импорт settings.py
# your_app/models.py from django.db import models from django.conf import settings # (!) class YourModel(models.Model): title = models.CharField(max_length=255) author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) # usage
3. get_user_model()
Данный вариант разработчики рекомендуют использовать везде кроме models.py
, это связано с особенностями работы с signals.
# your_app/views.py from django.contrib.auth import get_user_model User = get_user_model() # часто встречается такой формат, но можно использовать без создания переменной