我有一些代码可以创建自定义页面对象作为数据导入的一部分:
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
这可能是相关的吗?
答案 0 :(得分:0)
看起来像内存中的父级"运行"对象已经过时了。在尝试添加子项之前从数据库中重新获取它可以解决问题:
run = RunPage.objects.get(id=run.id)