所以我最近試圖加載一些朋友建立的燈具到我的數據庫中。當我運行的服務器,雖然我得到的錯誤加載各種網頁:ContentType匹配查詢不存在
Caught DoesNotExist while rendering: ContentType matching query does not exist.
我試圖運行執行syncdb,甚至重置每個單獨的應用程序,但還沒有任何運氣。任何想法如何使這個錯誤消失?
所以我最近試圖加載一些朋友建立的燈具到我的數據庫中。當我運行的服務器,雖然我得到的錯誤加載各種網頁:ContentType匹配查詢不存在
Caught DoesNotExist while rendering: ContentType matching query does not exist.
我試圖運行執行syncdb,甚至重置每個單獨的應用程序,但還沒有任何運氣。任何想法如何使這個錯誤消失?
如果你看看燈具內部,每個燈具有三個根字段:PK,fields
(它是該表中PK'th項的一組字段)和一個包含應用程序名稱的model
。型號名稱,ORM從中導出表格信息。
這是Django通過ContentType引擎查找的appname.modelname來確定將數據放入哪個表。
您的朋友給了您至少一個夾具,其中model
字段的內容與數據庫中的任何實際模型都不匹配。這可能是拼寫錯誤,誤解,模型或應用程序名稱的改變,或任何數量的錯誤。但是夾具不符合項目中的任何模型,並且夾具導入程序通過說明它無法將模型的指定名稱與項目ContentType表中的任何名稱進行匹配。
該問題的解決方法可能很簡單,只需確定表應該具有哪些內容類型,然後打開夾具並在model:
行上進行大規模搜索和替換即可。
編輯:
這是一個很長(很長!)過期編輯。如果您的dumpdata
包含通用數據或對其他地方的泛型表的引用,您必須必須(我真的不能強調您有多少必須)瞭解標誌。不是通過數字保存contentType信息,而是通過名稱保存它,使得重新加載數據庫變得更加容易,而且容易得多,而且容易出錯。
你可以在你的數據庫手動檢查每一個的ContentType表或:
或者你可以使用的Django的遷移工具之一:
或者更復雜的south
我發現這個錯誤不同的原因,我想補充的情況下,這可以幫助別人。導致此問題的原因是我創建了具有特定權限的組,然後卸載組中引用的應用程序。
具體而言,我已經安裝了一次性反轉,並創建了一個名爲「站點編輯器」的組,給了用戶創建,編輯和刪除修訂版的權限。後來我未安裝的版本,但該組的權限仍然當我跑了「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中導入這些信息會導致出現此錯誤消息。
在這種情況下,編輯-at數據庫級別 - db1中的django_content_type表並刪除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'}
然後,您可以檢查該模型/應用安裝或從您的夾具中刪除這些記錄。
由於Django 1.7,'--natural'標誌已被棄用。相反,你可以使用'--natural-foreign' – DMunoz