← Назад к вопросам

Как добавить поля в модель пользователя?

2.3 Middle🔥 261 комментариев
#Django#Базы данных (SQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Добавление полей в модель пользователя

Процесс зависит от стека технологий, но я покажу самый распространённый вариант с Django ORM и PostgreSQL.

Шаг 1: Модифицируем модель

Открываем models.py и добавляем поля:

from django.db import models
from django.contrib.auth.models import AbstractUser
from datetime import datetime

class CustomUser(AbstractUser):
    bio = models.TextField(blank=True, default="")
    avatar = models.ImageField(upload_to="avatars/", null=True, blank=True)
    phone = models.CharField(max_length=15, unique=True, null=True, blank=True)
    age = models.IntegerField(null=True, blank=True)
    is_verified = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    class Meta:
        db_table = "auth_user"

Шаг 2: Создаём миграцию

python manage.py makemigrations
python manage.py migrate

Важно: если модель уже существует в БД, Django автоматически создаст миграцию с добавлением полей.

Шаг 3: Валидация в моделе (опционально)

Добавляем метод clean() для валидации:

from django.core.exceptions import ValidationError

class CustomUser(AbstractUser):
    # ... поля выше ...
    
    def clean(self):
        super().clean()
        if self.age and (self.age < 0 or self.age > 150):
            raise ValidationError({"age": "Возраст должен быть от 0 до 150"})
        if self.phone and not self.phone.isdigit():
            raise ValidationError({"phone": "Телефон должен содержать только цифры"})

Алтернатива: SQLAlchemy (если используешь FastAPI/SQLAlchemy)

from sqlalchemy import Column, String, Integer, DateTime, Boolean, func
from sqlalchemy.orm import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = "users"
    
    id = Column(Integer, primary_key=True)
    username = Column(String(50), unique=True, nullable=False)
    email = Column(String(100), unique=True, nullable=False)
    bio = Column(String(500), default="")
    phone = Column(String(15), unique=True, nullable=True)
    age = Column(Integer, nullable=True)
    is_verified = Column(Boolean, default=False)
    created_at = Column(DateTime, server_default=func.now())
    updated_at = Column(DateTime, onupdate=func.now())

Шаг 3b (SQLAlchemy): Создаём миграцию Alembic

alembic revision --autogenerate -m "Add new user fields"
alembic upgrade head

Лучшие практики

1. Используй default или null=True для старых записей

  • Без этого миграция упадёт, если уже есть данные
  • Можно задать default значение или null=True

2. Не забывай про индексы

  • Для часто используемых полей (phone, email): db_index=True

3. Обновляй сериализаторы/валидаторы

  • Если используешь Django REST Framework, обнови ModelSerializer

4. Пиши тесты

  • Проверь миграцию отката: python manage.py migrate --fake 0001
  • Убедись, что старые записи не сломались

Проверка результата

from myapp.models import CustomUser

# Создаём юзера с новыми полями
user = CustomUser.objects.create_user(
    username="john_doe",
    email="john@example.com",
    bio="Software Engineer",
    phone="+79991234567",
    age=28
)
user.clean()  # Валидируем перед сохранением
user.save()

print(user.bio)  # "Software Engineer"
print(user.created_at)  # текущее время

Частые ошибки

❌ Добавить поле без null=True или default к существующей модели ❌ Забыть обновить сериализаторы в API ❌ Не проверить обратимость миграции ✅ Всегда тестируй миграции на копии данных