Wagtail'这个路径的页面已经存在。'尝试手动创建页面时出错

时间:2017-08-25 16:34:49

标签: wagtail django-treebeard

我有一些代码可以创建自定义页面对象作为数据导入的一部分:

instance = PerformancePage(
    run=run,
    date=json_data['date'],
    time=json_data['time'],
    price=json_data['price'],
    title=f'{run.title} {json_data["date"]} {json_data["id"]}',
    content_type=ContentType.objects.get_for_model(PerformancePage)
)
perf = run.add_child(instance=instance)

有时会加注:

django.core.exceptions.ValidationError: {'path': ['Page with this Path already exists.']}

一些调试代码确实显示有另一个页面具有相同的路径:

except ValidationError:
    print('error attempting to save', instance)
    print('path', instance.path)
    print('is leaf', run.is_leaf())
    rivals = Page.objects.filter(path=instance.path)
    print(rivals.last().specific.run == run)

为什么会这样?

尝试手动增加竞争路径以设置新路径也不起作用:

instance.path = rivals.last().specific._inc_path()
perf = run.add_child(instance=instance)
# still raises

有趣的是,如果我只是跳过这些例外并继续导入, 当我打印出这些路径时,它们似乎遵循类似的模式:

path 00010001000T0005000D0001
path 00010001000T000800050001
path 00010001000T000900060001
path 00010001000T000A00050001
path 00010001000T000A00050001
path 00010001000T000A00070001
path 00010001000T000A00070001
path 00010001000T000A00030001

这可能是相关的吗?

1 个答案:

答案 0 :(得分:0)

看起来像内存中的父级"运行"对象已经过时了。在尝试添加子项之前从数据库中重新获取它可以解决问题:

 run = RunPage.objects.get(id=run.id)