Миграция данных в django

Опубликовано 2021.09.24

Создавать миграции командой python manage.py makemigrations вы и так умеете. Если кто не знает эту команду - она создаст файлы миграции при добавлении(или изменении моделей). С миграцией данных будет похожий механизм, давайте его рассмотрим.

Чтоб подготовить файл миграции введите команду:

  1. python manage.py makemigrations my_module --empty

Где my_module - имя модуля. После этого создастся файл в папке migrations, который отработает как и все остальные миграции.

В него мы добавим методы migrate и reverse_migrate.

Допустим у нас есть модель, под названием IssueType и вам нужно добавить в БД 3 экземпляра этой модели.

Добавим типы в миграции:

  1. ISSUE_TYPES = [
  2. "Ошибка",
  3. "Исправление",
  4. "Повтор",
  5. ]

Метод миграции будет выглядеть так:

  1. def migrate(apps, schema_editor):
  2. IssueType = apps.get_model("issues", "IssueType")
  3. for type_name in ISSUE_TYPES:
  4. IssueType.objects.get_or_create(name=type_name)

Метод отката миграции будет выглядеть так:

  1. def reverse_migrate(apps, schema_editor):
  2. IssueType = apps.get_model("issues", "IssueType")
  3. IssueType.objects.filter(name__in=ISSUE_TYPES).delete()

И в сам класс Migration добавляем методы миграции в переменную operations

  1. class Migration(migrations.Migration):
  2. dependencies = [
  3. ("issues", "0001_initial"),
  4. ]
  5. operations = [migrations.RunPython(migrate, reverse_migrate)]

Теперь, при применении миграции в БД будут три строчек в таблице модели IssueType