我正在开发一个现有的Django 2.2应用程序,该应用程序包含与Wagtail CMS结合使用的自定义应用程序,在该应用程序中,我会随着时间的推移在单独的用户故事中反复添加新的Wagtail页面类型。
我希望能够创建一个“主”或“索引”迁移,该迁移在运行迁移时自动在数据库中预构建每个页面类型(我们在部署时在Ansible任务中执行)。据我所知,我需要什么:
dependencies
属性-每次使用一个表示新页面迁移名称的列表条目就可以更新。添加。我已经可以在create()
中调用的migrations.RunPython()
方法中使用以下逻辑自动构建页面类型,但目前,这种相同页面构建逻辑需要可以存在于每个页面的迁移中-如果此迁移存在于可以始终运行的单个迁移(如果DJango中存在一个替代过程)中,则我更喜欢它。
理想情况下,下面的page_types
列表可以用迭代BasePage.__subclasses__()
代替(其中所有页面类型都继承自BasePage
),这意味着无需更改此“主”迁移再次。
注意:如果有帮助,则该项目仍在开发中,因此任何有争议的解决方案或严格意义上仅“仅开发”的解决方案都是可以接受的-假定可以接受,因此在以后合并迁移时争议较小。 / p>
...
...
# Fetch the pre-created, root Page"
root_page = BasePage.objects.all().first()
page_types = [
ManageAccountPage,
EditUserDetailPage,
]
path_init = int('000100020003') # The last value for `path` from 0007_initialise_site_ttm.py
# Create, then add all child pages
for page_type in page_types:
title_raw = page_type.__name__.replace('Page', '')
page = page_type(
title=utils.convert_camel_to_human(title_raw),
slug=title_raw.lower(),
show_in_menus='t',
content_type=ContentType.objects.get_for_model(page_type),
path=path_init + 1,
depth=2
)
try:
root_page.add_child(instance=page)
except exceptions.ValidationError:
continue
...
...
出什么问题了?
(请参见下面的“我尝试过的方法”)
我尝试过的事情:
pin_curr_migration()
调用的自定义migrations.RunPython()
方法,该方法删除了django_migrations
中“主”迁移自身的记录,从而允许其重新运行。但是,这会导致DJango抱怨已经存在的先前构建页面的错误。