Ответ
Атрибут 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.