Для чего используется атрибут replaces в миграциях Django

Ответ

Атрибут replaces в файле миграции Django указывает, что данная миграция заменяет собой последовательность других миграций. Это основной инструмент для сжатия миграций (squashing).

Почему это важно:

В больших проектах со временем накапливаются сотни файлов миграций. Это замедляет выполнение команды migrate на новых базах данных (например, при развертывании или в CI/CD) и усложняет навигацию по коду.

Сжатие миграций с помощью replaces позволяет:

  1. Ускорить применение миграций: Django пропустит все перечисленные в replaces миграции и применит только одну, сжатую.
  2. Уменьшить количество файлов: Старые файлы миграций можно безопасно удалить, что делает проект чище.

Пример:

Предположим, у нас есть миграции 0001_initial.py и 0002_add_field.py. Мы можем создать сжатую миграцию 0003_squashed.py:

# myapp/migrations/0003_squashed.py
from django.db import migrations

class Migration(migrations.Migration):

    # Эта миграция заменяет собой первые две
    replaces = [
        ('myapp', '0001_initial'),
        ('myapp', '0002_add_field'),
    ]

    initial = True # Важно указать, что она может быть начальной

    dependencies = []

    operations = [
        # Здесь содержится итоговая структура моделей,
        # объединяющая все изменения из 0001 и 0002
    ]

Теперь при запуске migrate на чистой БД Django сразу применит 0003_squashed.py, проигнорировав 0001 и 0002.