Как правильно переименовать модель страницы трясогузки - PullRequest
0 голосов
/ 23 января 2019

У меня есть две модели в приложении трясогузки, PageType и NewPageType, и мне нужно заменить PageType на NewPageType.

Я думал, что смогу удалить PageType из моего models.py, а затем запустить миграцию, чтобы удалить его, а затем переименовать NewPageType в PageType и запустить вторую миграцию.

Однако при этом я сталкиваюсь с ошибками:

[2019-01-22 23:20:26,344] [ERROR] Internal Server Error: /cms/
Traceback (most recent call last):
  File "/.../python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/.../python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  [...snip...]
  File "/.../python3.6/site-packages/django/db/models/query.py", line 1121, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/.../python3.6/site-packages/wagtail/core/query.py", line 397, in specific_iterator
    yield pages_by_type[content_type][pk]
KeyError: 278

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

1 Ответ

0 голосов
/ 23 января 2019

Это потому, что страницы Wagtail используют Наследование нескольких таблиц , а часть ваших удаленных PageType страниц все еще существует.

Давайте рассмотрим новую установку Wagtail (т.е. wagtail start mysite), которая поставляется с моделью home.HomePage и создает одну HomePage по умолчанию.Мы можем взглянуть на базу данных и подтвердить, что в базе данных действительно есть запись:

sqlite> SELECT * FROM home_homepage;
page_ptr_id
3

Однако она довольно пуста.Там нет названия, нет пути, ничего, кроме page_ptr_id.Это потому, что HomePage наследуется от модели Page, которая не является абстрактной.Следовательно, для этой модели Page существует таблица базы данных (вот как Многостоловое наследование работает с Django).Давайте посмотрим на соответствующую таблицу (добровольно пропуская некоторые столбцы):

sqlite> SELECT id, path, title, slug, url_path, content_type_id FROM wagtailcore_page;
id|path    |title|slug|url_path|content_type_id
1 |0001    |Root |root|/       |1
3 |00010001|Home |home|/home/  |2

Вот она!

Аналогично, в вашем случае есть wagtailcore_page, myapp_pagetype и myapp_newpagetype таблицы.Удалив модель PageType, django создал миграцию, которая затем удалила myapp_pagetype, но оставила запись в таблице wagtailcore_page.Поэтому теперь, когда вы загружаете интерфейс администратора, Wagtail пытается загрузить страницу № 3, но не может это сделать.

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

Вам все равно придется переименовать вторую модель, хотя это может быть сложно с Django, хотя, если вам повезет,переименование его в файл models.py и запуск makemigrations может быть достаточным для Django, чтобы определить, что он должен переименовать модель.Если нет, или если у вас есть отношения, которые нужно переименовать, возможно, будет задействовано больше, см. 1 и 2 .

...