Запрос соответствия ContentType не существует

недавно я попытался загрузить некоторые светильники, настроенные другом в мою базу данных. Когда я запускаю сервер и загружаю различные страницы, хотя я получаю ошибку:

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

Я попытался запустить syncdb и даже сбросить каждое из приложений по отдельности, но не повезло. Есть идеи, как избавиться от этой ошибки?

6 ответов


если вы посмотрите внутри приспособления, то каждое приспособление имеет 3 поля корня: ПК,fields (который представляет собой набор полей для PK-й записи в этой таблице) и model, который содержит имя приложения.modelname, из которого ORM получает сведения о таблице.

это имя приложения.modelname, что Django ищет, через ContentType engine, чтобы выяснить, в какую таблицу поместить ваши данные.

ваш друг дал вам по крайней мере один прибор, в котором содержание the


вы можете проверить вручную каждую таблицу ContentType в вашей БД или:

  • Если ваши таблицы пусты, удаляет таблицы ваших моделей в вашем db et повторно запустить syncdb (только если ваш в разработке)

или вы можете использовать один из инструментов миграции Django:


Я нашел другую причину этой ошибки, я хотел добавить, если это поможет кому-то еще. Причиной этой проблемы для меня является то, что я создал группу с определенными разрешениями, а затем удалил приложение, на которое ссылались в группе.

в частности, я установил reversion в какой-то момент и создал группу под названием "редактор сайта", которая дала пользователю разрешение на создание, редактирование и удаление ревизий. Позже я не установил ревизию, но разрешения группы остались когда я запустил команду "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.

моим решением было просто удалить любую ссылку на реверсию и версии в самом приспособлении, например:

    [
{
    "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, где приложения никогда не присутствовали, появляется это сообщение об ошибке.

в этом случае отредактируйте-на уровне базы данных - таблицу django_content_type в db1 и удалите типы контента, которые больше не используются в приложении django. Затем снова перенесите или скопируйте данные в db2.

Если типы контента указаны в других таблицах, вам может потребоваться сначала удалить их там или использовать команду Drop CASCADE (рискованно!).

предупреждение: редактирование на уровне базы данных это рискованный бизнес, поэтому обязательно сделайте резервную копию перед привлечением и не делайте этого в производственных базах данных.

в зависимости от типа базы данных вам понадобится другой инструмент для редактирования.

mysql -> [MySQLWorkBench][1]
postgres -> [pgAdmin][2] 
SQLite -> [SQLite Browser][3]

в некоторых случаях эта ошибка возникает, когда ваше приспособление содержит ссылки на модель, которая не существует, либо потому, что она не была установлена, либо ее приложение не было добавлено вашим 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"
)

это не удается, потому что в postgres; app_label и model все поля нижнего регистра. Поэтому используйте __iexact поиск поля, который будет игнорировать случай.

entry_content_type = ContentType.objects.get(
    app_label__iexact="entries", model__iexact="Entry"
)