我正在重组我的 Wagtail 应用程序,以删除其中仅包含单个项目的 IndexPage,并将该项目移至当前 IndexPage 父级的子级。
基本上是从这个开始:
Page--|
|--IndexPage--|
|--ChildPages
(其中只有 1 个)
to this:
Page--|
|--ChildPage
我对模型进行了更改,以便使用此结构来创建新内容,并修复相关视图以直接指向 ChildPage。但现在我想将当前数据迁移到新结构,但我不知道如何去做...理想情况下,这将在迁移中完成,这样我们就不必手动进行任何操作。
有没有办法在迁移过程中以编程方式将这些 ChildPage 在树上移动?
不幸的是,有一个硬性限制(可能)排除了在迁移中进行页面树调整的可能性:诸如插入、移动和删除页面之类的树操作是作为Page
模型,并且在迁移中您只能访问该模型的“虚拟”版本,这只能让您访问数据库字段和基本 ORM 方法,而不是那些自定义方法。
(您也许可以通过放置来解决这个问题from wagtail.wagtailcore.models import Page
在您的迁移中并使用它而不是标准Page = apps.get_model("wagtailcore", "Page")
方法,但我不建议这样做 - 如果迁移在迁移序列中的某个点运行,则很容易中断Page
模型仍在构建中,与模型的“真实”状态不匹配。)
相反,我建议写一个Django管理命令 https://docs.djangoproject.com/en/1.11/howto/custom-management-commands/进行树操作 - 在管理命令中is安全进口Page
来自 wagtailcore 的模型,以及您的特定页面模型。Page
提供了一个方法move(target, pos)
哪个有效根据 Treebeard API http://django-treebeard.readthedocs.io/en/latest/api.html#treebeard.models.Node.move- 移动子页面的代码可能类似于:
from myapp.models import IndexPage
# ...
for index_page in IndexPage.objects.all():
for child_page in index_page.get_children():
child_page.move(index_page, 'right')
index_page.delete()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)