Запрос соответствия 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"
)