Вопрос проверяет знание способов расширения стандартной модели пользователя Django, что необходимо для добавления полей и логики, специфичных для проекта.
Кастомизация пользовательской модели в Django — ключевая задача при разработке приложений, которым требуются дополнительные поля (например, номер телефона, аватар) или нестандартная логика аутентификации. Стандартная модель django.contrib.auth.models.User имеет ограниченный набор полей (username, email, password и т.д.), поэтому Django предоставляет гибкие механизмы для её расширения или полной замены.
Это самый простой подход, когда вы создаёте отдельную модель Profile и связываете её с User через OneToOneField. Он подходит, если нужно добавить несколько дополнительных полей, не затрагивая процесс аутентификации.
from django.db import models
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
phone = models.CharField(max_length=20)
avatar = models.ImageField(upload_to='avatars/')
bio = models.TextField(blank=True)Недостаток: требуется отдельный запрос для получения данных профиля, что может быть неудобно.
Это рекомендуемый подход для большинства проектов. Вы создаёте собственную модель, наследуясь от AbstractUser, которая уже содержит все поля стандартного User. Это позволяет добавить свои поля прямо в модель пользователя.
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
phone = models.CharField(max_length=20, blank=True)
date_of_birth = models.DateField(null=True, blank=True)
# Можно также изменить существующие поля, например:
email = models.EmailField(unique=True)
# Важно: указать в settings.py
# AUTH_USER_MODEL = 'myapp.CustomUser'Преимущество: все данные пользователя в одной таблице, сохраняется вся встроенная функциональность Django (админка, группы, разрешения).
Этот подход используется для полной кастомизации, когда нужно, например, заменить поле для аутентификации с username на email или добавить нестандартные требования. Вы наследуетесь от AbstractBaseUser, который содержит только базовые поля (id, password, last_login) и методы, а все остальные поля и логику определяете сами.
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
class MyUserManager(BaseUserManager):
def create_user(self, email, password=None):
# Кастомная логика создания пользователя
if not email:
raise ValueError('Users must have an email')
user = self.model(email=self.normalize_email(email))
user.set_password(password)
user.save(using=self._db)
return user
class MyUser(AbstractBaseUser):
email = models.EmailField(unique=True)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
full_name = models.CharField(max_length=255)
# Добавляем кастомные поля
objects = MyUserManager()
USERNAME_FIELD = 'email' # Поле для аутентификации
REQUIRED_FIELDS = ['full_name']Этот подход требует больше кода, но даёт максимальный контроль.
Вывод: Используйте AbstractUser, если нужно просто добавить поля к стандартной модели. Выбирайте AbstractBaseUser только при необходимости фундаментальных изменений (например, аутентификация по email). Подход с профилем подходит для быстрого расширения без миграций в существующих проектах.