在Django中加载fixture时,contenttypes可能会出现问题。

13 浏览
0 Comments

在Django中加载fixture时,contenttypes可能会出现问题。

由于contenttypes冲突,我在将Django fixtures加载到我的MySQL数据库中遇到了问题。首先,我尝试只从我的应用程序中导出数据,像这样:

./manage.py dumpdata escola > fixture.json

但我一直遇到缺失外键的问题,因为我的应用程序"escola"使用了其他应用程序的表格。我一直添加其他应用程序,直到我得到这个:

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

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

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

问题似乎是Django尝试使用与fixture的主键值冲突的不同主键值动态重新创建contenttypes。这似乎与这里记录的错误相同:http://code.djangoproject.com/ticket/7052

问题是,推荐的解决方法是导出contenttypes应用程序,而我已经在做了!?这是怎么回事?如果有任何区别,我确实有一些自定义模型权限,如此处记录:http://docs.djangoproject.com/en/dev/ref/models/options/#permissions

0
0 Comments

在Django中,当加载fixture时,可能会遇到与contenttypes相关的问题。这篇文章将介绍这个问题的原因以及解决方法。

问题的原因是,当加载fixture时,Django会尝试创建contenttypes表的记录。然而,如果在fixture中的数据引用了contenttypes表中的记录,那么在创建这些记录之前,Django就会尝试创建引用的记录,从而导致出错。

为了解决这个问题,可以按照以下步骤操作:

首先,在Django项目的根目录下打开终端。

然后,运行以下命令:

manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission --indent 4

这个命令会将数据以fixture的形式导出到控制台,并且排除了contenttypes和auth.Permission表的数据。同时,它还会将外键和主键转换为自然键,以避免出现问题。

接着,将输出的数据复制到一个新的fixture文件中,比如"myfixture.json"。

最后,运行以下命令加载fixture文件:

manage.py loaddata myfixture.json

通过这些步骤,就可以成功加载fixture文件,并且避免了与contenttypes相关的问题。

总结起来,当在Django中加载fixture时,可能会遇到与contenttypes相关的问题。为了解决这个问题,可以使用manage.py dumpdata命令将数据导出为fixture文件,并通过manage.py loaddata命令加载fixture文件。这样可以避免创建contenttypes表记录时出现的问题。

0
0 Comments

问题出现的原因是在Django中使用fixture加载数据时出现了contenttypes的问题。解决方法可以通过在加载fixture之前对contenttypes应用进行重置来解决这个问题。

具体解决方法如下:

1. 使用命令manage.py reset重置contenttypes应用,以删除与导入的数据不匹配的自动生成的contenttypes数据。

2. 可以使用dumpdata命令的--natural标志来导出数据,这是最佳的解决方法。

另外,某些情况下在TestCase类中进行重置操作,可以通过在Django的TestCase类中查找代码来找到在syncdb之后和加载fixture之前执行重置操作的方法。

另一种解决方法是放弃使用fixture,而是直接使用SQL转储来导出和导入数据,但这样会失去数据库的可移植性。

总之,解决这个问题的方法是通过重置contenttypes应用或使用--natural标志导出数据来避免contenttypes的问题。

0
0 Comments

在Django中,使用manage.py dumpdata --natural命令可以使用一种更持久的表示方式来序列化外键,这些外键在Django中被称为“自然键”。例如,Permission.codename代替Permission.idUser.username代替User.id。在这里可以了解更多关于“自然键”的信息。

dumpdata命令还有一些其他有用的参数:

- --indent=4:使输出结果更易读。

- -e sessions:排除session数据。

- -e admin:排除管理后台上管理员操作的历史记录。

- -e contenttypes -e auth.Permission:排除在syncdb期间自动重建的对象。只有与--natural一起使用时才有效,否则可能会导致id编号错位。

但是,当试图加载回这些fixtures时,可能会遇到如下错误:TypeError: string indices must be integers, not str。为什么会出现这个错误呢?

为什么总是要使用-e contenttypes -e auth.permission--natural一起使用呢?我刚刚尝试了不使用--natural选项也可以成功。而且文档中也说,如果在DUMPING auth.permissioncontenttypes时应该使用这个选项。

原因是,当从头开始执行syncdb后,新创建的ContentTypePermission不能保证与之前的id相同。你的数据转储包含的id可能会引用加载数据时的不同对象。它可能之前有以下原因之一导致你的操作成功:1)你的数据没有引用这些对象;2)Permission/ContentTypes的原始id被保留;3)你的加载操作成功,但实际上你的数据已经损坏,因为对象引用了错误的对象,只是你还不知道而已。

--natural标志现在已被弃用,推荐使用--natural-foreign(和--natural-primary)代替。最终的命令可以是:manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission --indent 4 > project_dump.json

现在--natural已完全删除,不再是弃用状态。请使用--natural-foreign--natural-primary

0