Объединение двух типов страниц о трясогузках в одну
Допустим, у нас есть два типа страниц ContentPage
и Folder
, которые выполняют одну и ту же работу, и мы хотим объединить их в один.
В основном мы хотим объединить Folder
в ContentPage
.
Я пришел к следующему решению, но хочу быть уверенным, что ничего не упустил.
- миграция:
class Migration(migrations.Migration):
dependencies = [
...
]
operations = [
# copy all `folder` specific fields into `contentpage` table
migrations.RunSQL(
"""
INSERT INTO app_contentpage (
page_ptr_id,
...,
body,
...
) SELECT
...,
body,
...
FROM app_folderpage;
"""
),
# update all tables that have references to `django_content_type` table
# folder.content_type_id = 12
# contentpage.content_type_id = 11
migrations.RunSQL(
"""UPDATE wagtailcore_page SET content_type_id = 11 WHERE content_type_id = 12;"""
),
migrations.RunSQL(
"""UPDATE wagtailcore_modellogentry SET content_type_id = 11 WHERE content_type_id = 12;"""
),
migrations.RunSQL(
"""UPDATE wagtailcore_pagelogentry SET content_type_id = 11 WHERE content_type_id = 12;"""
),
migrations.RunSQL(
"""UPDATE wagtailcore_revision SET content_type_id = 11 WHERE content_type_id = 12;"""
),
migrations.RunSQL(
"""UPDATE wagtailcore_taskstate SET content_type_id = 11 WHERE content_type_id = 12;"""
),
migrations.RunSQL(
"""UPDATE wagtailcore_workflowstate SET content_type_id = 11 WHERE content_type_id = 12;"""
),
migrations.RunSQL(
"""UPDATE wagtailsearch_indexentry SET content_type_id = 11 WHERE content_type_id = 12;"""
),
migrations.RunSQL(
"""UPDATE wagtailcore_workflowcontenttype SET content_type_id = 11 WHERE content_type_id = 12;"""
),
migrations.RunSQL(
"""UPDATE wagtailcore_task SET content_type_id = 11 WHERE content_type_id = 12;"""
),
migrations.RunSQL("""DELETE FROM app_folderpage;"""),
]
запустить
.python manage.py rebuild_references_index
. Также можно было бы обновитьwagtailcore_referenceindex
с помощью SQL, но мне кажется, что запускrebuild_references_index
более надеженудалите
Folder
модель из кода и запуститеpython manage.py makemigrations
вручную очистите (или создайте миграцию) 'auth_permission' и
django_admin_log
where content_type_id is equalfolder.content_type_id
удалите
app_folder*
записи изdjango_content_type
Буду признателен за любые мысли и комментарии.