Django में एक स्थिरता लोड करते समय सामग्री के साथ समस्या


104

मुझे अपने MySQL डेटाबेस में Django जुड़नारों को लोड करने में समस्या हो रही है क्योंकि सामग्री विवादों का सामना करना पड़ रहा है। पहले मैंने इस तरह से केवल अपने ऐप से डेटा डंप करने की कोशिश की:

./manage.py dumpdata escola > fixture.json

लेकिन मुझे विदेशी महत्वपूर्ण समस्याएं मिलती रहीं, क्योंकि मेरा ऐप "एस्कोला" अन्य अनुप्रयोगों के तालिकाओं का उपयोग करता है। जब तक मुझे यह नहीं मिला, मैं अतिरिक्त ऐप्स जोड़ता रहा:

./manage.py dumpdata contenttypes auth escola > fixture.json

अब समस्या निम्नलिखित बाधा उल्लंघन है जब मैं एक परीक्षण स्थिरता के रूप में डेटा को लोड करने का प्रयास करता हूं:

IntegrityError: (1062, "Duplicate entry 'escola-t23aluno' for key 2")

ऐसा लगता है कि समस्या यह है कि Django अलग-अलग प्राथमिक कुंजी मूल्यों के साथ सामग्री को गतिशील रूप से फिर से बनाने की कोशिश कर रहा है जो कि स्थिरता से प्राथमिक प्रमुख मूल्यों के साथ संघर्ष करता है। ऐसा प्रतीत होता है कि बग यहां दस्तावेज के समान है: http://code.djangoproject.com/ticket/7052

समस्या यह है कि अनुशंसित वर्कअराउंड सामग्री एप को डंप करने के लिए है जो मैं पहले से कर रहा हूं !? क्या देता है? यदि इससे कोई अंतर पड़ता है तो मेरे पास कुछ कस्टम मॉडल अनुमतियाँ हैं जैसे कि यहाँ दस्तावेज: http://docs.djangoproject.com/en/dev/ref/models/options/#permissions

जवाबों:


148

manage.py dumpdata --naturalविदेशी कुंजियों के अधिक टिकाऊ प्रतिनिधित्व का उपयोग करेगा। Django में उन्हें "प्राकृतिक कुंजी" कहा जाता है। उदाहरण के लिए:

  • Permission.codename के पक्ष में उपयोग किया जाता है Permission.id
  • User.username के पक्ष में उपयोग किया जाता है User.id

और पढ़ें: "सीरियस डेजंगो ऑब्जेक्ट्स" में नेचुरल कीज़ सेक्शन

इसके लिए कुछ अन्य उपयोगी तर्क dumpdata:

  • --indent=4 इसे मानव पठनीय बनाओ।
  • -e sessions सत्र डेटा को बाहर करें
  • -e admin व्यवस्थापक साइट पर व्यवस्थापक कार्यों के इतिहास को बाहर करें
  • -e contenttypes -e auth.Permissionहर बार स्कीमा से स्वचालित रूप से पुन: बनाए जाने वाले ऑब्जेक्ट को बाहर करें syncdb। केवल इसे एक साथ उपयोग करें --naturalया फिर आप बुरी तरह से संरेखित आईडी संख्याओं के साथ समाप्त हो सकते हैं।

1
@skyjur हमेशा -e contenttypes -e auth.permissionसाथ क्यों इस्तेमाल करते हैं --natural? मैंने सिर्फ --naturalविकल्प के बिना कोशिश की और यह काम कर गया। इसके अलावा प्रलेखन यहाँ अगर एक के लिए इस विकल्प का उपयोग करना चाहिए कहते हैं डंपिंग auth.permission और contenttypes
wlnirvana

6
@winirvana क्योंकि आप स्क्रैच से शुरू करने के बाद और syncdb करते हैं, नए बनाए गए हैं ContentTypeऔर पहले Permissionजैसी ही आईडी प्राप्त करने की गारंटी नहीं है। आपके डेटा डंप में वो आईडी होती हैं जो अलग-अलग ऑब्जेक्ट को एनरोड डेटाबेस पर संदर्भित कर सकती हैं जहां आप लोडटाटा करेंगे। इनमें से किसी एक कारण से यह आपके लिए काम कर सकता है: 1) आपके डेटा में इन वस्तुओं का कोई संदर्भ नहीं था 2) अनुमति / सामग्री के मूल आईडी 3 संरक्षित किए गए थे) आपका लोडडेटा रसीला था, लेकिन आपके पास वास्तव में वस्तुओं के कारण भ्रष्ट डेटा है गलत वस्तुओं का जिक्र और आप इसके बारे में अभी तक नहीं जानते हैं
स्की

12
ध्वज --naturalअब --natural-foreign(और --natural-primary) के पक्ष में हटा दिया गया है
frnhr

16
अंतिम आदेश हो सकता है:manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission --indent 4 > project_dump.json
पाओलो

4
--naturalअब पूरी तरह से हटा दिया गया है, न केवल पदावनत। उपयोग --natural-foreignया --natural-primaryइसके बजाय।
कोड-अपरेंटिस

35

हाँ, यह वास्तव में परेशान है। थोड़ी देर के लिए मैंने फिक्सेटर लोड करने से पहले कंटेंटेप्स ऐप पर "मैनेजडोमो रिसेट" करके (डंप किए गए वर्जन से अलग-अलग जेनरेट किए गए कॉन्टेंटटाइप्स डेटा से छुटकारा पाने के लिए) ऐसा करके काम किया। यह काम किया, लेकिन आखिरकार मैं परेशानियों से परेशान हो गया और पूरी तरह से सीधे एसक्यूएल डंप (निश्चित रूप से, फिर आप डीबी पोर्टेबिलिटी खो देते हैं) के पक्ष में जुड़नार को त्याग दिया।

अद्यतन - सबसे अच्छा उत्तर --naturalध्वज का उपयोग करना है dumpdata, जैसा कि नीचे दिए गए उत्तर में दिया गया है। जब मैंने यह उत्तर लिखा था तब वह ध्वज मौजूद नहीं था।


3
मैं इसमें भी चल रहा था, मेरे लिए काम करने वाले कंटेंटपाइप ऐप को भी रीसेट कर रहा था। पारितोषिक के लिए धन्यवाद!
ब्यू

आपने उन्हें कैसे रीसेट किया? टेस्ट केस क्लास में? कृपया मुझे एक उदाहरण दें
ओल्गा तारासेंको

4
मैं unittests के लिए जुड़नार का उपयोग नहीं करता, मैं आम तौर पर एक सेटअप () विधि में ORM का उपयोग करके परीक्षण डेटा बनाता हूं क्योंकि यह परीक्षणों के साथ सिंक में रखना आसान है। इसलिए मुझे कभी भी TestCase क्लास में ऐसा नहीं करना पड़ा, हालाँकि मुझे यकीन है कि अगर आप Django के TestCase क्लास के कोड में इधर-उधर घूमते हैं तो आप समझ सकते हैं कि एक सब-पोस्ट में सबसिडीब और रिस्ट्रिक्शन लोडिंग से पहले रिसेट होने के लिए कैसे किया जा सकता है। मेरे लिए यह केवल "./manage.py" से पहले एक बैश स्क्रिप्ट में "./manage.py loaddata my_fixture" को रीसेट करना था।
कार्ल मेयर

32

स्थिरता बनाते समय कंटेंट को स्किप करने का प्रयास करें:

./manage.py dumpdata --exclude contenttypes > fixture.json

इसने यूनिट परीक्षणों के लिए एक समान स्थिति में मेरे लिए काम किया, सामग्री के बारे में आपकी अंतर्दृष्टि ने वास्तव में मदद की!


31

यहाँ सभी पुराने उत्तर ... 2017 के अनुसार, सबसे अच्छा उत्तर है:

manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission --indent 4

11

मैं MySQL का उपयोग नहीं कर रहा था, बल्कि एक लाइव सर्वर से कुछ डेटा को sqlite में आयात कर रहा था। समाशोधन contenttypesप्रदर्शन से पहले एप्लिकेशन डेटा loaddataथा चाल:

from django.contrib.contenttypes.models import ContentType
ContentType.objects.all().delete()
quit()

और तब

python manage.py loaddata data.json

django.core.exception.ImproperlyConfigured: अनुरोधित सेटिंग INSTALLED_APPS, लेकिन सेटिंग्स कॉन्फ़िगर नहीं की गई हैं। सेटिंग में पहुँचने से पहले आपको या तो पर्यावरण चर को परिभाषित करना होगा DJANGO_SETTINGS_MODULE या कॉल सेटिंग .configure ()।
बार्नी

यह शायद एक कस्टम प्रबंधन कमांड के हैंडल के भीतर सबसे अच्छा काम करेगा।
बार्नी

10

मैंने अपने डंप फ़ाइल को लोड करने से पहले यूनिट टेस्ट से contenttypes ऐप को रीसेट करके अपने परीक्षण मामलों में इस मुद्दे को हल किया है। कार्ल ने पहले ही manage.pyआदेश का उपयोग करते हुए यह सुझाव दिया और मैं केवल call_commandविधि का उपयोग करके ही काम करता हूं :

>>> from django.core import management
>>> management.call_command("flush", verbosity=0, interactive=False)
>>> management.call_command("reset", "contenttypes", verbosity=0, interactive=False)
>>> management.call_command("loaddata", "full_test_data.json", verbosity=0)

मेरी full_test_data.jsonस्थिरता में कंटेटटाइप्स ऐप डंप है जो परीक्षण के बाकी डेटा से मेल खाती है। लोड करने से पहले ऐप को रीसेट करके, यह डुप्लिकेट कुंजी को रोकता है IntegrityError


7
python manage.py dumpdata --natural-primary --exclude=contenttypes --exclude=auth.Permission --exclude=admin.logentry --exclude=sessions.session --indent 4 > initial_data.json

यह मेरे लिए काम करता है। यहाँ मैं वास्तविक मॉडल को प्रस्तुत करने वाली हर चीज़ को शामिल नहीं कर रहा हूँ।

  • यदि आप अपने द्वारा बनाए गए मॉडल के अलावा कोई अन्य मॉडल देखते हैं, तो आप उन्हें सुरक्षित रूप से बाहर कर सकते हैं। इस दृष्टिकोण का एक दोष यह है कि आप लॉग डेटा के साथ-साथ डेटा पर भी ढीले हैं।

6

आपको किसी भी विदेशी कुंजी और कई-से-कई रिश्तों का प्रतिनिधित्व करने के लिए प्राकृतिक कुंजियों का उपयोग करने की आवश्यकता है। इसके अलावा, यह बाहर करने के लिए एक अच्छा विचार हो सकता है sessionमें तालिका sessionsअनुप्रयोग, और logentryमें तालिका adminअनुप्रयोग।

Django 1.7+

python manage.py dumpdata --natural-foreign --exclude contenttypes --exclude auth.permission --exclude admin.logentry --exclude sessions.session --indent 4 > fixture.json

Django <1.7

python manage.py dumpdata --natural --exclude contenttypes --exclude auth.permission --exclude admin.logentry --exclude sessions.session --indent 4 > fixture.json

Django प्रलेखन के अनुसार , --naturalसंस्करण 1.7 में पदावनत किया गया है, इसलिए विकल्प --natural-foreignका उपयोग इसके बजाय किया जाना चाहिए।

आप इस ऑब्जेक्ट के क्रमबद्ध डेटा में प्राथमिक कुंजी को भी छोड़ सकते हैं क्योंकि इसकी गणना --natural-primaryध्वज को पारित करके डीरिएरलाइज़ेशन के दौरान की जा सकती है ।

python manage.py dumpdata --natural-foreign --natural-primary --exclude contenttypes --exclude auth.permission --exclude admin.logentry --exclude sessions.session --indent 4 > fixture.json

2
./manage.py dumpdata app.Model --natural-foreign

बदल जाएगा

  "content_type": 123

सेवा

  "content_type": [
    "app_label",
    "model"
  ],

और स्थिरता TestCaseअब के लिए काम करता है


2

Django 2.2.5

python manage.py dumpdata --exclude=contenttypes > datadump.json

इसने मेरी मदद की


जब लोडडाटा में समस्या आएगी, तो नए डेटाबेस में कंटेंटाइप के साथ बेमेल हो सकती है
यांग झोउ

1

मैं एक और संभावित उत्तर देने जा रहा हूं जो मुझे अभी पता चला है। शायद यह ओपी की मदद करेगा, शायद यह किसी और की मदद करेगा।

मुझे कई-कई रिलेशनशिप टेबल मिल गए हैं। इसमें एक प्राथमिक कुंजी और दो विदेशी कुंजी अन्य तालिकाओं के लिए है। मैंने पाया कि यदि मेरे पास फ़िक्चर में एक प्रविष्टि है, जिसकी दो विदेशी कुंजियाँ एक ही प्रविष्टि के साथ एक अलग पीके के साथ पहले से ही हैं , तो यह विफल हो जाएगी। एम 2 एम रिलेशनशिप टेबल में दो विदेशी कुंजियों के लिए "एक साथ अद्वितीय" है।

इसलिए, अगर यह एक एम 2 एम संबंध है जो टूट रहा है, तो इसे जोड़ने वाली विदेशी कुंजियों को देखें, अपने डेटाबेस को देखें कि क्या एफके की जोड़ी पहले से ही एक अलग पीके के तहत सूचीबद्ध है।


1

यह वास्तव में, वास्तव में कष्टप्रद है .. मैं हर बार इस से काटा जाता हूं।

मैंने --exclude contenttypes और --natural के साथ डंपडेट करने की कोशिश की, मुझे हमेशा समस्याएँ आती हैं ।।

मेरे लिए जो सबसे अच्छा काम करता है, truncate table django_content_type;वह सिंटेक्सब और उसके बाद डेटा लोड करने के बाद कर रहा है ।

बेशक शुरुआती_डॉट.जसन ऑटोलॉडिंग के लिए आप फ़ॉलबॉल हैं।


मेरे लिए, लोडडेटा से पहले तालिका को अलग करना बस अलग-अलग त्रुटियों का कारण बनता है। इस तकनीक के साथ कोई भाग्य नहीं।
शाकर

1

मुझे कभी-कभी ऐसी ही त्रुटि का सामना करना पड़ा था। यह पता चला कि मैं आवश्यक तालिकाओं को बनाने से पहले जुड़नार को लोड करने की कोशिश कर रहा था। तो मैंने किया:

$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py loaddata fixtures/initial_data.json

और यह एक आकर्षण की तरह काम करता था


0

मेरे मामले में मैंने परीक्षण उद्देश्यों के लिए स्थिरता का उपयोग करने के लिए auth( ./manage.py dumpddata auth > fixtures/auth.json) से डेटा डंप किया था ।

विकास जारी रहा और मैंने उन अधिकांश मॉडलों को हटा दिया जिन्हें मैंने परिभाषित किया था models.pyऔर यह तब है जब मैंने इस कष्टप्रद समस्या को देखना शुरू किया था।

मेरा समाधान दोबारा ओर्गेन.जसन स्थिरता को पुन: उत्पन्न कर रहा था। इस एक ने auth.permissionमेरे पास पुराने मॉडलों से संबंधित बहुत सारी प्रविष्टियाँ हटा दी थीं।


0

मैंने ऊपर से हर विधि की कोशिश की, मेरे लिए कुछ भी काम नहीं किया। मुझे पूरी तरह से मॉडल मॉडल को छोड़ना होगा और ठीक काम करना होगा।

python manage.py dumpdata --natural-primary --exclude=contenttypes --exclude=auth --exclude=admin.logentry --exclude=sessions.session --indent 4 > live.json
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.