Django 如何正确重命名wagtail页面模型
我的wagtail应用程序中有两种型号,Django 如何正确重命名wagtail页面模型,django,wagtail,Django,Wagtail,我的wagtail应用程序中有两种型号,PageType和NewPageType,需要将PageType替换为NewPageType 我想我可以从models.py中删除PageType,然后运行迁移将其删除,然后将NewPageType重命名为PageType,并运行第二次迁移 但是,我在执行此操作时遇到了错误: [2019-01-22 23:20:26344][ERROR]内部服务器错误:/cms/ 回溯(最近一次呼叫最后一次): 文件“/…/python3.6/site packages/
PageType
和NewPageType
,需要将PageType
替换为NewPageType
我想我可以从models.py
中删除PageType
,然后运行迁移将其删除,然后将NewPageType
重命名为PageType
,并运行第二次迁移
但是,我在执行此操作时遇到了错误:
[2019-01-22 23:20:26344][ERROR]内部服务器错误:/cms/
回溯(最近一次呼叫最后一次):
文件“/…/python3.6/site packages/django/core/handlers/exception.py”,第41行,内部
响应=获取响应(请求)
文件“/…/python3.6/site packages/django/core/handlers/base.py”,第187行,在“获取”响应中
response=self.process\u异常\u由\u中间件(e,请求)
[…剪断…]
文件“/…/python3.6/site packages/django/db/models/query.py”,第1121行,全部
self.\u result\u cache=list(self.\u iterable\u class(self))
文件“/…/python3.6/site packages/wagtail/core/query.py”,第397行,在特定迭代器中
按页面类型[内容类型][pk]生成页面
关键字错误:278
Django内置的迁移处理似乎没有自动更新某些内容。我不知道我在这里遗漏了什么步骤,所以我很想得到一些帮助。谢谢 这是因为Wagtail页面使用了已删除的
PageType
页面的一部分仍然存在
让我们看一看Wagtail的新安装(即Wagtail start mysite
),它附带了home.home
模型,并默认创建了一个主页。我们可以查看数据库并确认数据库中确实存在条目:
sqlite> SELECT * FROM home_homepage;
page_ptr_id
3
然而它是相当空的。没有标题,没有路径,只有一个页面\u ptr\u id
。这是因为主页
继承自非抽象的页面
模型。因此,该页面模型也有一个数据库表(这就是Django的工作方式)。让我们看看相应的表(自动匹配一些列):
给你
同样,在您的例子中,有wagtailcore\u页面
、myapp\u页面类型
和myapp\u新页面类型
表。通过删除PageType
模型,django创建了一个迁移,然后删除了myapp\u PageType
,但将条目保留在wagtailcore\u页面
表中。因此,现在,当您加载管理界面时,Wagtail尝试加载页面#3,但失败了
因此,在删除页面模型之前,需要先删除所有页面。您可以通过在迁移中添加一个步骤来实现这一点
您仍然需要重命名第二个模型,尽管这对于Django来说可能很困难,但如果幸运的话,在models.py
文件中重命名它,运行makemigrations
可能足以让Django检测到它应该重命名模型。如果没有,或者您有需要重命名为的关系,则可能需要更多发票,请参阅和。要从中恢复并能够再次加载管理员,请执行以下操作:
删除参考:
import django
django.setup()
from wagtail.core.models import PageRevision
PageRevision.objects.filter(page_id= 278).delete()
exit()
然后删除页面
django-admin dbshell
DELETE FROM wagtailcore_page WHERE id=278;
希望这能有所帮助。我是wagtail新手,但我在重命名模型和相关模板后运行时没有遇到任何问题
python manage.py makemigrations
python manage.py migrate
也就是说,我没有重复使用像OP这样的旧名称。我可能会建议任何有此问题的人为模型想出一个新名称,并使其具有描述性
python manage.py makemigrations
python manage.py migrate