有没有一种方法可以指定“主”迁移或“索引”迁移?

时间:2020-08-09 21:35:16

标签: python-3.x django wagtail django-migrations

我正在开发一个现有的Django 2.2应用程序,该应用程序包含与Wagtail CMS结合使用的自定义应用程序,在该应用程序中,我会随着时间的推移在单独的用户故事中反复添加新的Wagtail页面类型。

我希望能够创建一个“主”或“索引”迁移,该迁移在运行迁移时自动在数据库中预构建每个页面类型(我们在部署时在Ansible任务中执行)。据我所知,我需要什么:

  1. 自动构建的迁移,可修改每个页面的数据库架构
  2. 另一种迁移总是在 last 上运行,并且包含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抱怨已经存在的先前构建页面的错误。

0 个答案:

没有答案