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

Что происходит при команде makemigrations в Django?

2.0 Middle🔥 171 комментариев
#Python Core

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

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

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

Команда makemigrations в Django

Команда makemigrations — одна из ключевых команд Django ORM, которая создаёт файлы миграций на основе изменений в моделях. Это критически важная часть системы версионирования базы данных.

Как работает makemigrations

Когда вы запускаете python manage.py makemigrations, Django выполняет следующие шаги:

  1. Сканирование моделей — Django читает все модели из models.py в приложениях
  2. Сравнение состояний — сравнивает текущие модели с последней миграцией
  3. Обнаружение изменений — выявляет добавленные, удаленные или изменённые поля
  4. Генерация кода — создаёт файл миграции с SQL-операциями
  5. Сохранение файла — сохраняет миграцию в папку migrations/

Примеры изменений в моделях

# Исходная модель
class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()

После добавления нового поля:

# Измененная модель
class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()
    age = models.IntegerField(null=True)  # Новое поле

При запуске makemigrations создастся файл вроде 0002_user_age.py:

from django.db import migrations, models

class Migration(migrations.Migration):
    dependencies = [
        ('app', '0001_initial'),
    ]
    
    operations = [
        migrations.AddField(
            model_name='user',
            name='age',
            field=models.IntegerField(null=True),
        ),
    ]

Обнаруживаемые изменения

Django автоматически отслеживает:

  • Новые модели — создание класса Model
  • Удаление моделей — удаление класса
  • Новые поля — добавление field в модель
  • Удаление полей — удаление field из модели
  • Изменение параметровmax_length, null, default и т.д.
  • Изменение типов полей — например, CharField → TextField
  • Изменение Meta параметровordering, verbose_name и т.д.

Параметры команды

# Создать миграции для всех приложений
python manage.py makemigrations

# Создать миграции только для конкретного приложения
python manage.py makemigrations app_name

# Просмотреть SQL без создания файла
python manage.py makemigrations --dry-run --verbosity 3

# Создать пустую миграцию для ручного редактирования
python manage.py makemigrations --empty app_name --name custom_migration

# Проверить, нужны ли новые миграции
python manage.py makemigrations --check

Важные моменты

Именование файлов: миграции нумеруются последовательно (0001, 0002, 0003...)

Зависимости: каждая миграция указывает, на какой миграции она строится:

class Migration(migrations.Migration):
    dependencies = [
        ('app', '0001_initial'),  # зависит от предыдущей
    ]

Идемпотентность: миграции должны быть безопасны для многократного применения

Типичные операции в миграциях

operations = [
    migrations.CreateModel(
        name='Post',
        fields=[
            ('id', models.AutoField(primary_key=True)),
            ('title', models.CharField(max_length=200)),
        ],
    ),
    migrations.AddField(
        model_name='user',
        name='profile_image',
        field=models.ImageField(upload_to='profiles/', null=True),
    ),
    migrations.AlterField(
        model_name='user',
        name='email',
        field=models.EmailField(unique=True),
    ),
    migrations.DeleteModel(
        name='OldModel',
    ),
    migrations.AddConstraint(
        model_name='user',
        constraint=models.UniqueConstraint(
            fields=['email', 'username'],
            name='unique_email_username'
        ),
    ),
]

Применение миграций

После создания миграции её нужно применить:

python manage.py migrate
python manage.py migrate app_name 0003  # Применить до конкретной миграции
python manage.py migrate app_name zero  # Откатить все миграции

Важные правила

  • Никогда не редактируй уже примененные миграции вручную
  • Всегда коммить миграции в version control
  • Проверяй миграцию перед её применением в продакшене
  • Используй --dry-run для предварительного просмотра
  • Для сложных операций создавай пользовательские миграции

Проблемы и решения

Проблема: Django не обнаружил изменения Решение: проверь, что файл __init__.py есть в папке migrations/

Проблема: конфликт при слиянии веток Решение: создай новую миграцию, которая зависит от обеих веток

Команда makemigrations — это фундамент версионирования БД в Django, обеспечивающий безопасное и отслеживаемое управление схемой данных.

Что происходит при команде makemigrations в Django? | PrepBro