Отмена миграции для дублирующегося поля

У нас в модели Django Wagtail было добавлено дублирующее поле, которое запутало систему миграции.

Некоторое время назад в одну из моделей было добавлено следующее, вместе с миграцией, которая добавила единичный экземпляр поля:

    stream = fields.StreamField(
        who_fund_blocks,
        blank=True,
        verbose_name="Additional content",
    )
    stream = fields.StreamField(
        who_fund_blocks,
        blank=True,
        verbose_name="Additional content",
    )

Все было в порядке, и проект продолжил работу, добавляя новые поля и миграции в другие места без каких-либо проблем.

Затем дублирующее поле было замечено и удалено со страницы моделей.

Теперь, если мы попытаемся добавить поле в некоторую модель и миграцию для нее, миграция создается, но не завершается, хотя нет никаких ошибок, прямо указывающих на неудачу:

(.venv)  development  ➜ app 🐟 manpy migrate
/root/.cache/pypoetry/virtualenvs/.venv/lib/python3.10/site-packages/wagtail/utils/widgets.py:10: RemovedInWagtail70Warning: The usage of `WidgetWithScript` hook is deprecated. Use external scripts instead.
  warn(
System check identified some issues:

WARNINGS:
?: (urls.W005) URL namespace 'freetag_chooser' isn't unique. You may not be able to reverse all URLs in this namespace
?: (urls.W005) URL namespace 'pagetag_chooser' isn't unique. You may not be able to reverse all URLs in this namespace
?: (urls.W005) URL namespace 'sectiontag_chooser' isn't unique. You may not be able to reverse all URLs in this namespace
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, core, csp, django_cron, donations, importers, sessions, submissions, taggit, taxonomy, users, wagtail_localize, wagtailadmin, wagtailcore, wagtaildocs, wagtailembeds, wagtailforms, wagtailimages, wagtailredirects, wagtailsearch, wagtailsearchpromotions, wagtailusers
Running migrations:
  Applying core.0019_utilitypage_show_navigation_bar_and_more...

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

А когда я запускаю сервер, мы получаем:

You have 1 unapplied migration(s). Your project may not work properly until you apply the migration for app(s): core.
Run 'python manage.py migrate' to apply them.

В базе данных, похоже, уже есть это поле, но система миграции хочет попытаться добавить его снова, но не может, и это блокирует все другие миграции.

Если я закомментирую оба поля stream, миграции могут быть сделаны, но сайт ломается на странице, где база данных ожидает присутствия поля stream. Полагаю, я могу удалить поля stream и вручную добавить поле stream в базу данных, но при этом мы потеряем часть данных, и я бы предпочел исправить это с помощью Django и миграций.

Есть идеи, как это распутать?

Трудно дать совет, не видя ваших файлов миграции и базы данных. Похоже, что в вашей таблице базы данных есть только одна копия stream, верно? Поэтому, как только вы удалите дублирование в файле модели, таблица базы данных и ваша питоновская модель будут совпадать.

Предполагая, что это ваша ситуация, я бы отредактировал ваши старые файлы миграции, чтобы удалить упоминание о дубликате. Затем попробуйте запустить migrate и makemigrations + migrate на копии вашей рабочей базы данных, пока не убедитесь, что все работает так, как вы хотите.

Если в вашей таблице есть дублирующиеся столбцы, мой первый вопрос - как это могло произойти, а второй - какую базу данных вы используете? Я почти уверен, что в базе данных не может быть дублирующихся столбцов, но если это так, то это будет более долгий разговор.

Вернуться на верх