मैं डेटाबेस एरर अपवाद को फंसता हूं और जांचता हूं कि मैं जिस मॉडल का उपयोग करने की कोशिश कर रहा हूं, उसके लिए ContentType प्रविष्टि मौजूद है, अगर मुझे लगता है कि सिंकडीबी नहीं हो रहा है, अन्यथा लेनदेन को रोलबैक करें और मूल अपवाद को फिर से उठाएं। यह विधि केवल अतिरिक्त डीबी एक्सेस में होती है जब डेटाबेस एरर उठाया जाता है।
with transaction.commit_on_success():
try:
content_type = ContentType.objects.get_for_model(kwargs['instance'])
for relation in WorkflowTypeRelation.objects.filter(content_type=content_type):
workflow_instance = WorkflowInstance.objects.create(content_object=kwargs['instance'],
workflow_type=relation.workflow_type)
except DatabaseError as database_error:
try:
ContentType.objects.get(model='workflowtyperelation')
except ContentType.DoesNotExist:
# Most probable running during syncdb phase,
# so ignore the exception
pass
except DatabaseError:
# ContentType model DB table doesn't exists,
# raise original exception
raise database_error
else:
# The ContentType model exists,
# there is something wrong with the DB
# raise original exception
transaction.rollback()
raise database_error
स्रोत
2013-03-05 06:06:11
दक्षिण में इसका मॉडल और एक टेबल है जहां यह जानकारी लॉग करता है जो माइग्रेशन चलाया गया है और जो नहीं था। हो सकता है कि आप इसका उपयोग यह जांचने के लिए कर सकें कि क्या माइग्रेशन की आवश्यकता है या नहीं? – Ski
यह एक विकल्प भी होगा। लेकिन चूंकि हैंडलर अक्सर सहेजे गए मॉडल पर पोस्ट-सेव सिग्नल के लिए हैं, इसलिए मैं इस बिंदु पर डीबी को अतिरिक्त राउंडट्रिप से बचना चाहता हूं। –
मुझे लगता है कि आप उस जानकारी को वैश्विक चर में सुरक्षित रूप से संग्रहीत कर सकते हैं और एप्लिकेशन शुरू होने पर इसे केवल एक बार पुनर्प्राप्त कर सकते हैं। – Ski