Как Django определяет порядок применения миграций

Ответ

Очередность применения миграций в Django строго определена и критически важна для целостности схемы базы данных. Django использует комбинацию двух механизмов:

  1. Лексикографический порядок имен файлов. Каждая миграция получает префикс-номер (0001_, 0002_ и т.д.), который задает базовую последовательность.
  2. Явные зависимости. Внутри каждого файла миграции есть поле dependencies, которое точно указывает, какие миграции должны быть выполнены до текущей. Это ключевой механизм для корректной работы в условиях ветвления и слияния в системах контроля версий.

Для отслеживания уже примененных миграций Django использует служебную таблицу в базе данных — django_migrations.

Пример файла миграции (0002_add_price.py):

# Generated by Django 4.1.7 on 2023-03-15 10:00

from django.db import migrations, models

class Migration(migrations.Migration):

    # Эта миграция зависит от выполнения '0001_initial'
    dependencies = [
        ('shop', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='product',
            name='price',
            field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
        ),
    ]

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

  • Никогда не редактируйте файлы миграций и их зависимости вручную после их создания и применения.
  • При работе в команде и возникновении конфликтов (две миграции с одинаковым номером) используйте команду python manage.py makemigrations --merge для их разрешения.
  • Команда python manage.py migrate автоматически определяет правильный порядок и применяет только недостающие миграции.