मेरे पास एक Django 1.3 ऐप है जिसके लिए मैं डीबी माइग्रेशन के लिए दक्षिण 0.7.3 का उपयोग कर रहा हूं। मुझे एक समस्या है जहां on_delete=models.SET_NULL
नियम मूल रूप से हटाए जाने पर फ़ायरिंग प्रतीत नहीं होता है, इस प्रकार मुझे अंतर्निहित डीबी (जो पोस्टग्रेस 8.4 है) से बाधा उल्लंघन दे रहा है।क्या Django डीबी ऑन-डिलीट नियमों को लागू करना चाहता है?
इकाई defns के प्रासंगिक भागों हैं:
class AccessPeriod:
....
class Payment:
period = models.ForeignKey(
AccessPeriod, related_name = "payments", db_index = True,
null = True, on_delete = models.SET_NULL)
कुछ खुदाई के बाद, मुझे पता चला कि दक्षिण वास्तव में एसक्यूएल यह माइग्रेशन के लिए उत्पन्न करता है में ON DELETE
खंड सम्मिलित नहीं है, इसलिए डीबी निश्चित रूप से नहीं है
http://south.aeracode.org/ticket/763
तब मैं on_delete नियम है, जो राज्य (मेरे जोर) के लिए Django डॉक्स पढ़ें:: टूटे हुए रिश्तों पर ही समाप्त करते हुये क्या करने जा
जब एक वस्तु एक ForeignKey द्वारा संदर्भित हटा दी जाती है, जैंगो डिफ़ॉल्ट द्वारा emulates हटाना कैस्केड और भी पर एसक्यूएल बाधा के व्यवहार ForeignKey युक्त वस्तु हटा देता है। यह व्यवहार on_delete तर्क निर्दिष्ट करके ओवरराइड किया जा सकता है।
"emulates" भाग मेरे लिए सुझाव दिया है कि Django on_delete स्वयं के व्यवहार को लागू करने के लिए कोशिश करता है और अंतर्निहित डीबी पर निर्भर नहीं करता स्वचालित रूप से लेनदेन के भाग के रूप में इस पर अमल करने, इस प्रकार दक्षिण बग अप्रासंगिक बना रही है।
मैं Django स्रोत में db/models/deletion.py
के माध्यम से एक प्रहार था और SET()
/SET_NULL()
और collect()
यह निश्चित रूप से Django की तरह लगता है के कार्यान्वयन के आधार पर यह अपने आप करने के लिए माना जाता है, फिर भी, अगर मैं Django व्यवस्थापक से एक AccessPeriod को हटाने का प्रयास , मुझे आईडी के लिए भुगतान तालिका पर बाधा उल्लंघन मिलता है, जो अभी भी संदर्भित है, जिसे अब हटा दिया गया है, यानी ऐसा लगता है कि Payment.period
पर रिलेशनशिप पर पर कॉलिंग पर कॉल के हिस्से के रूप में है।
क्या मैं यहां कुछ गलत कर रहा हूं, या गलत समझ रहा हूं कि Django क्या कर रहा है? बस डीईबीटीई नियम को स्वयं डालने के लिए डीबी को मैन्युअल रूप से हैक करने से बचने की कोशिश कर रहा है, जो बेहद भंगुर और भयानक लगता है।
यदि पोस्टग्रेज़ विफल होने पर आपको स्टैक ट्रेस मिलता है, तो शायद यह कहां होगा कि यह गलत कहां जा रहा है। यह ऐसा कुछ हो सकता है जिसे आपने अनदेखा किया हो। – leech