Ответ
Атрибут replaces
в файле миграции Django указывает, что данная миграция заменяет собой последовательность других миграций. Это основной инструмент для сжатия миграций (squashing
).
Почему это важно:
В больших проектах со временем накапливаются сотни файлов миграций. Это замедляет выполнение команды migrate
на новых базах данных (например, при развертывании или в CI/CD) и усложняет навигацию по коду.
Сжатие миграций с помощью replaces
позволяет:
- Ускорить применение миграций: Django пропустит все перечисленные в
replaces
миграции и применит только одну, сжатую. - Уменьшить количество файлов: Старые файлы миграций можно безопасно удалить, что делает проект чище.
Пример:
Предположим, у нас есть миграции 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
.