我最近尝试将一些灯具加载到我的数据库中。当我运行服务器并加载各种页面虽然我收到错误:
Caught DoesNotExist while rendering: ContentType matching query does not exist.
我已经尝试运行syncdb,并单独重置每个应用程序,但没有任何运气。如何使此错误消失?
如果您查看灯具内部,每个灯具有三个根域:PK,fields
(该表中PK'th条目的一组字段)和model
,其中包含appname.modelname,从中ORM派生表信息。
这是appname.modelname,Django通过ContentType引擎查找,以确定将数据放入哪个表。
您的朋友至少给了您一个夹具,其中model
字段的内容与您数据库中的任何实际模型都不匹配。这可能是拼写错误,误解,模型或应用程序名称的更改,或任何数量的错误。但是夹具与项目中的任何模型都不对应,并且夹具导入器告诉您,它说它不能将模型的指定名称与项目ContentType表中的任何名称相匹配。
修复可能很简单,只需要确定表应该具有什么作为ContentType,然后打开夹具并在model:
线上进行大规模搜索和替换。
编辑:
这是一个漫长的(长期!)逾期编辑。如果您要在其他地方使用包含通用数据或对通用表的引用的dumpdata
,您必须(我真的不能强调您必须多少)学习dumpdata --natural
标志。它不是按编号保存contentType信息,而是按名称保存,使数据库重新加载更容易,更容易出错。
您可以手动检查数据库中的每个ContentType表,或者:
或者您可以使用其中一个Django迁移工具:
我找到了这个错误的不同原因,我想添加以防万一这有助于其他人。导致此问题的原因是我创建了一个具有特定权限的组,然后卸载了该组中引用的应用程序。
具体来说,我曾在某一点安装了reversion,并创建了一个名为“Site Editor”的组,该组授予用户创建,编辑和删除修订的权限。后来我卸载了修订版,但是当我运行“dumpdata”命令时,组权限仍然存在:
[
{
"fields": {
"name": "Site Editor",
"permissions": [
[
"add_logentry",
"admin",
"logentry"
],
[
"change_logentry",
"admin",
"logentry"
],
[
"delete_logentry",
"admin",
"logentry"
],
[
"add_group",
"auth",
"group"
],
[
"change_group",
"auth",
"group"
],
[
"delete_group",
"auth",
"group"
],
[
"add_revision",
"reversion",
"revision"
],
[
"change_revision",
"reversion",
"revision"
],
[
"delete_revision",
"reversion",
"revision"
],
[
"add_version",
"reversion",
"version"
],
[
"change_version",
"reversion",
"version"
],
[
"delete_version",
"reversion",
"version"
],
[
"add_session",
"sessions",
"session"
],
[
"change_session",
"sessions",
"session"
],
[
"delete_session",
"sessions",
"session"
],
[
"add_site",
"sites",
"site"
],
[
"change_site",
"sites",
"site"
],
[
"delete_site",
"sites",
"site"
]
]
},
"model": "auth.group",
"pk": 2
}]
当我试图运行“loaddata”命令时,我一直遇到这个错误:
django.core.serializers.base.DeserializationError:
Problem installing fixture '/Users/me/Documents/Sites/project/path/fixtures/configuration.json':
ContentType matching query does not exist.
我的解决方案是简单地删除任何对revert的引用和fixture本身的版本,如下所示:
[
{
"fields": {
"name": "Site Editor",
"permissions": [
[
"add_logentry",
"admin",
"logentry"
],
[
"change_logentry",
"admin",
"logentry"
],
[
"delete_logentry",
"admin",
"logentry"
],
[
"add_group",
"auth",
"group"
],
[
"change_group",
"auth",
"group"
],
[
"delete_group",
"auth",
"group"
],
[
"add_session",
"sessions",
"session"
],
[
"change_session",
"sessions",
"session"
],
[
"delete_session",
"sessions",
"session"
],
[
"add_site",
"sites",
"site"
],
[
"change_site",
"sites",
"site"
],
[
"delete_site",
"sites",
"site"
]
]
},
"model": "auth.group",
"pk": 2
}]
然后我能够毫无问题地导入夹具。
从django 1.7开始,dumpdata选项已经改变:请参阅http://polarhome.com:753/doc/python-django-doc/html/topics/serialization.html
所以你使用:
python manage.py dumpdata --natural-foreign --natural-primary --exclude > my_fixture.json
python manage.py loaddata my_fixture.json
或者,也可以解决根本原因:确保源和目标数据库中的内容类型匹配。我在数据库之间移动数据时遇到了同样的错误,其中db1仍然具有同时删除的应用程序中的内容类型。在db2中导入这些应用程序永远不存在的导致这个错误消息。
在这种情况下,编辑-at database level- db1中的django_content_type表,并删除django应用程序中不再使用的内容类型。然后再次将数据迁移或复制到db2。
如果在其他表中引用了内容类型,则可能需要先将其删除,或使用DROP CASCADE命令(冒险!)。
警告:在数据库级别进行编辑是一项有风险的业务,因此请确保在使用之前进行备份,而不要在生产数据库上执行此操作。
根据数据库类型,您需要使用其他工具进行编辑。
mysql -> [MySQLWorkBench][1]
postgres -> [pgAdmin][2]
SQLite -> [SQLite Browser][3]
在某些情况下,当您的fixture包含对不存在的模型的引用时会导致此错误,原因是它尚未安装或其应用尚未添加到您的INSTALLED_APPS中。不幸的是,Django的错误信息在追踪它时非常无用。
如果您在Queryset.get
中编辑django/db/models/query.py
方法以打印出*args
和**kwargs
通过,您将收到更有用的错误消息,如:
DeserializationError: Problem installing fixture ... ContentType matching query does not exist. args=() kwargs={'model': u'somenewmodel', 'app_label': u'somenewapp'}
然后,您可以检查是否已安装此型号/应用程序,或从夹具中删除这些记录。
您最近是否更改过使用postgres
的mysql
?
当查询contenttypes
时,例如:
entry_content_type = ContentType.objects.get(
app_label="entries", model="Entry"
)
这失败了,因为在qazxsw poi; qazxsw poi和qazxsw poi都是小写字段。因此,使用postgres
字段查找将忽略大小写。
app_label
经过大量试验后,这对我有用。我在群组和日志方面遇到了很多麻烦。