加载灯具+添加页面:IntegrityError(重复键值)

时间:2018-05-17 09:32:16

标签: django fixtures wagtail

我有一个迁移,它加载一个夹具,用于使用基本网站结构填充数据库(来自Loading initial data with Django 1.7 and data migrations )。迁移完成后,我的测试添加了一个(自定义)NewsPage。这会在/ admin / pages / add / website / newspage / 5 /中产生" IntegrityError 重复键值违反了唯一约束" wagtailcore_page_pkey" DETAIL:Key(id)=(3)已经存在。"当我通过管理界面添加页面时也会发生同样的情况。

有点怀疑pk = 3的页面是我的夹具中创建的第一个页面。另外两个pk已经由Wagtail的迁移创建了。

我已经读过有关迁移的灯具,而且似乎Postgres不会重置主键序列。我假设这也是我的问题。

我在Django: loaddata in migrations errors中找到了一个可能的解决方案,但失败了(使用"psycopg2.ProgrammingError: syntax error at or near "LINE 1: BEGIN;")。试图执行它的要点,我运行了sqlsequencereset管理命令(./manage.py sqlsequencereset wagtailcore myapp),但我仍然得到错误,虽然现在id = 4。

  • 我的假设是正确的,Postgres没有重置主键序列是我的问题吗?
  • 有没有人知道如何从迁移加载的灯具中/之后可靠地修复它?
  • 在Python代码中创建内容会更容易/更可靠吗?

编辑(当天):

如果我不遵循Loading initial data with Django 1.7 and data migrations中的示例,只需运行管理命令,就可以了:

def load_fixture(fixture_file):
    """Load a fixture."""
    commands = StringIO()
    call_command('loaddata', fixture_file, stdout=commands)

我不知道这种更简单方法的缺点是什么。

编辑2(同一天):

好的我知道,灯具将基于当前的模型状态,而不是迁移的状态,因此如果您的模型发生变化,它可能会中断。

我将整个事情转换为Python代码。这有效,并可能继续工作。今天我学会了:不要在迁移中加载装置。 (可惜,这将是一个很好的捷径。)

0 个答案:

没有答案