ContentType匹配查询不存在

问题描述 投票:8回答:7

我最近尝试将一些灯具加载到我的数据库中。当我运行服务器并加载各种页面虽然我收到错误:

Caught DoesNotExist while rendering: ContentType matching query does not exist.

我已经尝试运行syncdb,并单独重置每个应用程序,但没有任何运气。如何使此错误消失?

django content-type
7个回答
12
投票

如果您查看灯具内部,每个灯具有三个根域:PK,fields(该表中PK'th条目的一组字段)和model,其中包含appname.modelname,从中ORM派生表信息。

这是appname.modelname,Django通过ContentType引擎查找,以确定将数据放入哪个表。

您的朋友至少给了您一个夹具,其中model字段的内容与您数据库中的任何实际模型都不匹配。这可能是拼写错误,误解,模型或应用程序名称的更改,或任何数量的错误。但是夹具与项目中的任何模型都不对应,并且夹具导入器告诉您,它说它不能将模型的指定名称与项目ContentType表中的任何名称相匹配。

修复可能很简单,只需要确定表应该具有什么作为ContentType,然后打开夹具并在model:线上进行大规模搜索和替换。

编辑:

这是一个漫长的(长期!)逾期编辑。如果您要在其他地方使用包含通用数据或对通用表的引用的dumpdata,您必须(我真的不能强调您必须多少)学习dumpdata --natural标志。它不是按编号保存contentType信息,而是按名称保存,使数据库重新加载更容易,更容易出错。


1
投票

您可以手动检查数据库中的每个ContentType表,或者:

  • 如果表是空的,则删除db中的模型表并重新运行syncdb(仅当您正在开发中时)

或者您可以使用其中一个Django迁移工具:


0
投票

我找到了这个错误的不同原因,我想添加以防万一这有助于其他人。导致此问题的原因是我创建了一个具有特定权限的组,然后卸载了该组中引用的应用程序。

具体来说,我曾在某一点安装了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
}]

然后我能够毫无问题地导入夹具。


0
投票

从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]

0
投票

在某些情况下,当您的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'}

然后,您可以检查是否已安装此型号/应用程序,或从夹具中删除这些记录。


0
投票

您最近是否更改过使用postgresmysql

当查询contenttypes时,例如:

entry_content_type = ContentType.objects.get(
    app_label="entries", model="Entry"
)

这失败了,因为在qazxsw poi; qazxsw poi和qazxsw poi都是小写字段。因此,使用postgres字段查找将忽略大小写。

app_label

0
投票

经过大量试验后,这对我有用。我在群组和日志方面遇到了很多麻烦。

  • 在sqllite上启动服务器时,转到admin并删除所有组。然后在shell中键入以下内容: python manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission -e admin.Logentry> datadump_3.json
  • 在settings.py中将设置更改为MySQL
  • python manage.py加载数据datadump_3.json
© www.soinside.com 2019 - 2024. All rights reserved.