在 Django 中加载固定装置时出现内容类型问题

由于内容类型冲突,我无法将 Django 固定装置加载到我的 MySQL 数据库中.首先,我尝试只从我的应用程序中转储数据,如下所示:

I am having trouble loading Django fixtures into my MySQL database because of contenttypes conflicts. First I tried dumping the data from only my app like this:

./manage.py dumpdata escola > fixture.json

但我总是遇到缺少外键的问题,因为我的应用程序escola"使用了其他应用程序中的表.我一直在添加其他应用程序,直到我做到这一点:

but I kept getting missing foreign key problems, because my app "escola" uses tables from other applications. I kept adding additional apps until I got to this:

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

现在问题是当我尝试将数据加载为测试夹具时出现以下约束冲突:

Now the problem is the following constraint violation when I try to load the data as a test fixture:

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

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

It seems the problem is that Django is trying to dynamically recreate contenttypes with different primary key values that conflict with the primary key values from the fixture. This appears to be the same as bug documented here: http://code.djangoproject.com/ticket/7052

问题是推荐的解决方法是转储我已经在做的内容类型应用程序!?是什么赋予了?如果有什么不同,我确实有一些自定义模型权限,如此处所述:http://docs.djangoproject.com/en/dev/ref/models/options/#permissions

The problem is that the recommended workaround is to dump the contenttypes app which I'm already doing!? What gives? If it makes any difference I do have some custom model permissions as documented here: http://docs.djangoproject.com/en/dev/ref/models/options/#permissions

推荐答案

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

manage.py dumpdata --natural will use a more durable representation of foreign keys. In django they are called "natural keys". For example:

  • Permission.codename 用于支持 Permission.id
  • User.username 用于 User.id
  • Permission.codename is used in favour of Permission.id
  • User.username is used in favour of User.id

阅读更多:序列化 django 对象"中的自然键部分

dumpdata 的一些其他有用参数:

Some other useful arguments for dumpdata:

  • --indent=4 使其易于阅读.
  • -e 会话排除会话数据
  • -e admin 排除管理站点上的管理操作历史记录
  • -e contenttypes -e auth.Permission 排除在 syncdb 期间每次从模式中自动重新创建的对象.只能将它与 --natural 一起使用,否则您可能会得到对齐错误的 id 编号.
  • --indent=4 make it human readable.
  • -e sessions exclude session data
  • -e admin exclude history of admin actions on admin site
  • -e contenttypes -e auth.Permission exclude objects which are recreated automatically from schema every time during syncdb. Only use it together with --natural or else you might end up with badly aligned id numbers.

相关文章