Вопрос или проблема
Согласно Wagtail 4.0, PageRevision
был заменен на Revision
.
Теперь у меня есть очень старый файл миграции, который имеет ленивую ссылку на него:
class Migration(migrations.Migration):
dependencies = [
# ...
]
operations = [
migrations.CreateModel(
name="MyModel",
fields=[
('revision', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wagtailcore.pagerevision')),
# другие поля
],
),
]
и у меня есть 98 файлов миграции сверху. Все работает нормально, и я могу создавать новые миграции без ошибок. Но как только я пытаюсь выполнить миграцию обратно на любое число, я получаю:
ValueError: Поле myapp.MyModel.revision было объявлено с ленивой ссылкой на 'wagtailcore.pagerevision', но приложение 'wagtailcore' не предоставляет модель 'pagerevision'.
что имеет смысл. Я пытался исправить это, заменив старую ссылку на wagtailcore.revision
, но я все равно получаю ошибку. Также пытался обновить MyModel
, чтобы он ссылался на новый wagtail.models.Revision
, но новая миграция не обнаружена, и я по-прежнему получаю ошибку:
ValueError: Поле myapp.MyModel.revision было объявлено с ленивой ссылкой на 'wagtailcore.revision', но приложение 'wagtailcore' не предоставляет модель 'revision'.
Есть ли какие-нибудь идеи, как это правильно исправить?
Ответ или решение
Обновление wagtailcore.PageRevision в старом файле миграции при переходе на Wagtail 4.0
При обновлении до Wagtail 4.0 необходимо учесть, что модель PageRevision
была заменена на Revision
. Это изменение может вызвать проблемы с референсами в ваших миграциях, особенно если у вас есть старые миграционные файлы, содержащие ссылки на устаревшую модель. Рассмотрим шаги по исправлению проблемы на примере старого файла миграции:
1. Понимание проблемы
Когда вы пытаетесь откатить миграции, возникает ошибка:
ValueError: The field myapp.MyModel.revision was declared with a lazy reference to 'wagtailcore.pagerevision', but app 'wagtailcore' doesn't provide model 'pagerevision'.
Это связано с тем, что Wagtail больше не предоставляет модель pagerevision
, и приложение wagtailcore
больше не может разрешить эту ссылку.
2. Исправление ссылки на модель
Сначала нужно обновить файл миграции. Откройте старый файл миграции и замените:
('revision', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wagtailcore.pagerevision')),
на:
('revision', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wagtailcore.Revision')),
3. Создание новой миграции
После внесения изменений в файл миграции вам нужно создать новую миграцию. Убедитесь, что миграция была обновлена корректно, и выполните команду:
python manage.py makemigrations
Если новая миграция не создаётся автоматически, необходимо использовать следующую команду, чтобы явно указать изменения:
python manage.py makemigrations myapp --empty
В этом случае создаётся пустая миграция, и вы можете добавить необходимые операции вручную:
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
# Укажите зависимости вашей миграции
]
operations = [
migrations.RemoveField(
model_name='mymodel',
name='revision',
),
migrations.AddField(
model_name='mymodel',
name='revision',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wagtailcore.Revision'),
),
]
4. Тестирование изменений
После того как вы создали новую миграцию, выполните:
python manage.py migrate
Тестируйте откат миграций, чтобы убедиться, что ошибки не возникают и все работает корректно.
5. Очистка миграционного состояния
Если ошибка всё ещё возникает, стоит рассмотреть вариант очистки миграционных данных и восстановления базы до состояния до миграции. Для этого можно использовать:
python manage.py migrate myapp zero
Это откатит все миграции вашего приложения. Возможно, также потребуется вручную удалить запись о миграции из django_migrations
, если возникли проблемы с синхронизацией.
Заключение
Обновление модели PageRevision
до Revision
является важным шагом при переходе на Wagtail 4.0. Убедитесь, что все старые миграции были обновлены, чтобы избежать ошибок при откате миграций. Внимательный подход к переименованию и созданию миграций защитит вас от преодоления потенциальных препятствий, обеспечивая при этом целостность и работоспособность вашего проекта.