在Django中加载fixture时Contenttypes的问题?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (48)

由于内容类型冲突,我无法将Django fixtures加载到我的MySQL数据库中。首先,我尝试从我的应用程序中倾销数据,如下所示:

./manage.py dumpdata escola > fixture.json

但我一直在错过外键问题,因为我的应用程序“escola”使用来自其他应用程序的表。我一直添加额外的应用程序,直到我得到这个:

./manage.py dumpdata contenttypes auth escola > fixture.json

现在,当我尝试将数据作为测试夹具载入时,问题是以下约束违规:

IntegrityError: (1062, "Duplicate entry 'escola-t23aluno' for key 2")

看来问题在于,Django试图动态地重新创建具有不同主键值的contenttypes,这些值与fixture中的主键值冲突。这似乎与此处记录的错误相同:http : //code.djangoproject.com/ticket/7052

问题是,推荐的解决方法是转储我已经在做的contenttypes应用程序?是什么赋予了?如果它有什么区别,我确实有一些自定义模型权限,如下所示:http : //docs.djangoproject.com/en/dev/ref/models/options/#permissions

提问于
用户回答回答于

有一段时间我通过在加载fixture之前在contenttypes应用上执行“manage.py reset”来解决这个问题(为了摆脱与转储版本不同的自动生成的contenttypes数据)。

最好的答案是使用该--natural标志dumpdata

用户回答回答于

manage.py dumpdata --natural将使用更持久的外键表示。在Django中,它们被称为“自然键”。例如:

  • Permission.codename 被用于Permission.id
  • User.username 被用于 User.id

其他一些有用的dumpdata参数:

  • --indent=4 使其人类可读。
  • -e sessions 排除会话数据
  • -e admin 排除管理员网站上管理员操作的历史记录
  • -e contenttypes -e auth.Permission排除每次从模式中自动重新创建的对象syncdb。只有与它一起使用--natural,否则你可能会得到严重对齐的ID号码。

扫码关注云+社区

领取腾讯云代金券