← Назад к вопросам
Как добавить поля в модель пользователя?
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
❌ Не проверить обратимость миграции
✅ Всегда тестируй миграции на копии данных