2013-07-17 19 views
8

मेरे पास एक Django 1.5 प्रोजेक्ट में एक ऐप है (चलिए इसे MyApp कहते हैं)। MyApp एक कस्टम उपयोगकर्ता मॉडल (MyUser) परिभाषित करता है। प्रोजेक्ट एक और ऐप (अन्य ऐप) का उपयोग करता है जो MyUser का संदर्भ देता है। MyApp संदर्भ अन्य अनुप्रयोगों में संदर्भ फ़ील्ड।Django दक्षिण परिपत्र निर्भरता

सब कुछ मेरे विकास लैपटॉप पर ठीक काम कर रहा है। मैं अपने प्रोजेक्ट को सर्वर पर तैनात करने का प्रयास कर रहा हूं, और जब मैं माइग्रेट चरण पर आता हूं, तो MyApp किसी अन्य ऐप की निर्भरता के कारण विफल रहता है, और दूसरा ऐप MyApp पर निर्भरता पर विफल रहता है (मैंने ऐप्स को स्वतंत्र रूप से माइग्रेट करने का प्रयास किया है)। दोनों अपने पहले माइग्रेशन (0001)

Running migrations for myapp: 
- Migrating forwards to 0017_auto__blah_blah. 
> myapp:0001_initial 
FATAL ERROR - The following SQL query failed: ALTER TABLE "myapp_mymodel_othermodel" ADD CONSTRAINT "othermodel_id_refs_id_ae052c6d" FOREIGN KEY ("othermodel_id") REFERENCES "anotherapp_othermodel" ("id") DEFERRABLE INITIALLY DEFERRED; 
The error was: relation "anotherapp_othermodel" does not exist 

Error in migration: myapp:0001_initial 
DatabaseError: relation "anotherapp_othermodel" does not exist 


Running migrations for anotherapp: 
- Migrating forwards to 0008_blah_blah. 
> anotherapp:0001_initial 
FATAL ERROR - The following SQL query failed: ALTER TABLE "anotherapp_othermodel" ADD CONSTRAINT "creator_id_refs_id_cff6fecf" FOREIGN KEY ("creator_id") REFERENCES "myuser" ("id") DEFERRABLE INITIALLY DEFERRED; 
The error was: relation "myuser" does not exist 

Error in migration: anotherapp:0001_initial 
DatabaseError: relation "myuser" does not exist 

कोई विचार नहीं?

+0

इस समस्या के लिए एक (बंद) टिकट है (http://south.aeracode.org/ticket/390) जिसमें इस विषय की अच्छी चर्चा है। –

उत्तर

11

यहां वास्तविक परिपत्र निर्भरता प्रतीत होती है। आप इसे आसानी से तोड़ सकते हैं, हालांकि: MyApp में m2m तालिका के निर्माण को एक अलग माइग्रेशन में ले जाएं। ऐसा करने का सबसे आसान तरीका शायद, 0001_initial.py को एक नए नाम पर कॉपी करना है, फिर मूल में m2m तालिका (आगे और पीछे की ओर!) के लिए ब्लॉक को हटाएं, और कॉपी में बाकी सब कुछ हटा दें।

प्रतिलिपि का नाम दिया जाना चाहिए ताकि इसे 0001_initial और 0002_whatever के बीच आदेश दिया जा सके - कहें, 0001_initial2.py; और इसे ("अन्य ऐप", "0001_initial") पर निर्भर होना चाहिए - जो बदले में, "MyApp", "0001_initial") पर निर्भर होना चाहिए।

+1

बिल्कुल सही! मैं MyApp के लिए पहले माइग्रेशन में आवश्यक_बी का उपयोग करके समाप्त हुआ, फिर MyApp के लिए दूसरे माइग्रेशन के लिए निर्भर करता है। इसने मुझे अन्य ऐप को संशोधित किए बिना निर्भरताओं को स्थापित करने की अनुमति दी (जिसे कहीं और विकसित किया गया है) – askvictor

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