2011-07-14 140 views
6

所以我最近試圖加載一些朋友建立的燈具到我的數據庫中。當我運行的服務器,雖然我得到的錯誤加載各種網頁:ContentType匹配查詢不存在

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

我試圖運行執行syncdb,甚至重置每個單獨的應用程序,但還沒有任何運氣。任何想法如何使這個錯誤消失?

回答

11

如果你看看燈具內部,每個燈具有三個根字段:PK,fields(它是該表中PK'th項的一組字段)和一個包含應用程序名稱的model。型號名稱,ORM從中導出表格信息。

這是Django通過ContentType引擎查找的appname.modelname來確定將數據放入哪個表。

您的朋友給了您至少一個夾具,其中model字段的內容與數據庫中的任何實際模型都不匹配。這可能是拼寫錯誤,誤解,模型或應用程序名稱的改變,或任何數量的錯誤。但是夾具不符合項目中的任何模型,並且夾具導入程序通過說明它無法將模型的指定名稱與項目ContentType表中的任何名稱進行匹配。

該問題的解決方法可能很簡單,只需確定表應該具有哪些內容類型,然後打開夾具並在model:行上進行大規模搜索和替換即可。

編輯:

這是一個很長(很長!)過期編輯。如果您的dumpdata包含通用數據或對其他地方的泛型表的引用,您必須必須(我真的不能強調您有多少必須)瞭解​​標誌。不是通過數字保存contentType信息,而是通過名稱保存它,使得重新加載數據庫變得更加容易,而且容易得多,而且容易出錯。

+2

由於Django 1.7,'--natural'標誌已被棄用。相反,你可以使用'--natural-foreign' – DMunoz

1

你可以在你的數據庫手動檢查每一個的ContentType表或:

  • 如果你的表是空的,刪除你的模型的表格中你的數據庫等重新運行執行syncdb(僅當你在開發中)

或者你可以使用的Django的遷移工具之一:

0

我發現這個錯誤不同的原因,我想補充的情況下,這可以幫助別人。導致此問題的原因是我創建了具有特定權限的組,然後卸載組中引用的應用程序。

具體而言,我已經安裝了一次性反轉,並創建了一個名爲「站點編輯器」的組,給了用戶創建,編輯和刪除修訂版的權限。後來我未安裝的版本,但該組的權限仍然當我跑了「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 
}] 

然後,我能夠進口燈具沒有問題。

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數據庫級別 - db1中的django_content_type表並刪除django應用程序中不再使用的內容類型。 然後再將數據遷移或複製到db2。

如果內容類型在其他表中引用,則可能需要先在那裏刪除它們,或使用DROP CASCADE命令(有風險!)。

警告:在數據庫級別進行編輯是一項有風險的業務,因此務必在參與之前進行備份,並且不要在生產數據庫上執行此操作。

根據數據庫類型的不同,您需要一個不同的工具來進行編輯。

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

在某些情況下,這種錯誤是當你的燈具包含對不存在的模型引用造成的,可能是因爲它尚未安裝或其應用尚未添加你的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'} 

然後,您可以檢查該模型/應用安裝或從您的夾具中刪除這些記錄。