2011-07-14 14 views
6

इसलिए मैंने हाल ही में किसी मित्र द्वारा मेरे डेटाबेस में स्थापित कुछ फ़िक्स्चर लोड करने का प्रयास किया है। जब मैं सर्वर चलाने के लिए और विभिन्न पृष्ठों को लोड हालांकि मैं त्रुटि मिलती है:ContentType मिलान क्वेरी मौजूद नहीं है

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

मैं syncdb चल रहा है, और यहां तक ​​कि क्षुधा को व्यक्तिगत रूप से प्रत्येक को रीसेट की कोशिश की है, लेकिन किसी भी भाग्य नहीं किया है। इस त्रुटि को कैसे दूर किया जाए इस पर कोई विचार है?

उत्तर

11

यदि आप स्थिरता के अंदर देखते हैं, तो प्रत्येक स्थिरता में तीन रूट फ़ील्ड होते हैं: पीके, fields (जो उस तालिका में पीके की प्रविष्टि के लिए फ़ील्ड का एक सेट है), और model, जिसमें ऐपनाम शामिल है। मॉडल नाम, जिसमें से ओआरएम तालिका की जानकारी प्राप्त करता है।

यह वह नाम है जो Django को सामग्री प्रकार के माध्यम से देखता है, यह पता लगाने के लिए कि कौन सी तालिका आपके डेटा को रखती है।

आपके मित्र ने आपको कम से कम एक स्थिरता दी है जिसमें model फ़ील्ड की सामग्री आपके डेटाबेस में किसी भी वास्तविक मॉडल से मेल नहीं खाती है। यह एक गलत वर्तनी, गलतफहमी, मॉडल या एप्लिकेशन नाम में परिवर्तन, या किसी भी प्रकार की गलतियों हो सकती है। लेकिन यह स्थिरता आपके प्रोजेक्ट के किसी भी मॉडल से मेल नहीं खाती है, और स्थिरता आयातक आपको यह कहकर बता रहा है कि यह प्रोजेक्टटाइप तालिका प्रोजेक्ट्स में किसी भी नाम के साथ मॉडल के नामित नाम से मेल नहीं खा सकता है।

यह तय करना उतना सरल हो सकता है कि तालिका को सामग्री प्रकार के रूप में क्या माना जाता है, फिर स्थिरता खोलना और model: लाइन पर एक बड़े पैमाने पर खोज और प्रतिस्थापन करना।

संपादित करें:

यह एक लंबे (! लंबे) अतिदेय संपादित है। यदि आप dumpdata के बारे में हैं जिसमें सामान्य डेटा या सामान्य जेनेरिक टेबल के संदर्भ हैं, तो आप (मैं वास्तव में यह नहीं कह सकता कि आप कितना 0) dumpdata --natural ध्वज सीखें। सामग्री को सहेजने के बजाय संख्या के आधार पर जानकारी टाइप करें, यह इसे नाम से सहेज लेगा, डेटाबेस को फिर से लोड करना, बहुत आसान और कम त्रुटि-प्रवण।

+2

Django 1.7 के बाद से, 'प्राकृतिक' ध्वज को हटा दिया गया है। इसके बजाय, आप '- प्राकृतिक-विदेशी' का उपयोग कर सकते हैं – DMunoz

1

आप मैन्युअल रूप से अपने DB में हर ContentType तालिका जांच कर सकते हैं या:

  • अपने टेबल खाली हैं, तो अपने डाटाबेस एट में अपने मॉडल की तालिकाओं को हटा देता है syncdb दोबारा चलाता है (केवल आपके विकास में अगर)

या आप Django माइग्रेशन उपकरण से एक का उपयोग कर सकते हैं:

0

मैं इस त्रुटि के लिए एक अलग कारण नहीं पाया जटिल, मैं जोड़ने के लिए मामले में यह किसी और में मदद करता है चाहता था। मेरे लिए यह मुद्दा क्या कारण था कि मैंने विशिष्ट अनुमतियों वाला एक समूह बनाया था, और उसके बाद समूह में संदर्भित एक ऐप को अनइंस्टॉल किया था।

विशेष रूप से, मैंने एक बिंदु पर रिवर्सन स्थापित किया था, और "साइट संपादक" नामक एक समूह बनाया जिसने उपयोगकर्ता को संशोधन बनाने, संपादित करने और हटाने की अनुमति दी।बाद में मैंने अनइंस्टॉल करने वाले संशोधन, लेकिन समूह की अनुमतियों बने रहे जब मैं "DumpData" कमांड भाग गया:

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_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" कमांड चलाने का प्रयास किया, मैं यह त्रुटि में चल रखा

मेरे समाधान बस स्थिरता अपने आप में प्रत्यावर्तन और संस्करणों के लिए किसी भी संदर्भ को हटाने के लिए है, इसलिए की तरह था:

[ 
{ 
    "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 

वैकल्पिक रूप से, एक भी मूल कारण हल कर सकते हैं: सुनिश्चित करें कि सामग्री प्रकार में से मिलान करने के स्रोत और गंतव्य डेटाबेस। मुझे डेटाबेस के बीच डेटा को स्थानांतरित करने में एक ही त्रुटि का सामना करना पड़ा जहां डीबी 1 में अभी भी उन ऐप्स से सामग्री प्रकार थे जिन्हें वास्तविक समय में हटा दिया गया था। इन्हें डीबी 2 में आयात करना जहां ऐप्स कभी भी इस त्रुटि संदेश में परिणाम नहीं थे।

इस मामले में, डेटाबेस स्तर संपादित करें- django_content_type तालिका db1 में और सामग्री प्रकारों को हटा दें जो अब django अनुप्रयोग में उपयोग में नहीं हैं। फिर डेटा को माइग्रेट या प्रतिलिपि डीबी 2 पर दोबारा कॉपी करें।

यदि सामग्री के प्रकार अन्य तालिकाओं में संदर्भित हैं, तो आपको उन्हें पहले वहां हटाना होगा, या एक ड्रॉप कैस्केड कमांड (जोखिम भरा!) का उपयोग करना होगा।

चेतावनी: डेटाबेस स्तर पर संपादन एक जोखिम भरा व्यवसाय है इसलिए आकर्षक होने से पहले बैकअप लेना सुनिश्चित करें, और उत्पादन डेटाबेस पर ऐसा न करें।

डेटाबेस प्रकार के आधार पर, आपको संपादन करने के लिए एक अलग टूल की आवश्यकता होगी।

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

कुछ मामलों में, इस त्रुटि, के कारण होता है जब आपके स्थिरता एक मॉडल जो मौजूद नहीं है के संदर्भ हैं या तो इसे स्थापित नहीं किया गया है या उसके एप्लिकेशन को आपके अपने INSTALLED_APPS नहीं जोड़ा गया है क्योंकि। दुर्भाग्यवश, इस ट्रैकिंग को ट्रैक करते समय Django का त्रुटि संदेश बहुत बेकार है।

आप django/db/models/query.py में Queryset.get विधि संपादित करते हैं तो बाहर *args और **kwargs पारित कर मुद्रित करने के लिए, आप की तरह एक और अधिक उपयोगी त्रुटि संदेश मिल जाएगा:

DeserializationError: Problem installing fixture ... ContentType matching query does not exist. args=() kwargs={'model': u'somenewmodel', 'app_label': u'somenewapp'} 

तो फिर तुम जाँच कर सकते हैं इस मॉडल/एप्लिकेशन इंस्टॉल है कि या अपने रिकॉर्ड से उन रिकॉर्ड्स को हटा दें।

संबंधित मुद्दे