ऊपर का विचार
updated = Entry.objects.filter(Q(id=e.id) && Q(version=e.version))\
.update(updated_field=new_value, version=e.version+1)
if not updated:
raise ConcurrentModificationException()
बहुत अच्छा लग रहा है और बिना सीरियल लेनदेन के भी ठीक काम करना चाहिए।
समस्या यह है कि कैसे बहरेपन .save () व्यवहार को बढ़ाने के लिए है।
मैंने कस्टम मैनेजर के विचार को देखा।
मेरी योजना प्रबंधक _update पद्धति को ओवरराइड करने की है जिसे अद्यतन करने के लिए Model.save_base () द्वारा कहा जाता है।
यह Django 1.3 में वर्तमान कोड है
def _update(self, values, **kwargs):
return self.get_query_set()._update(values, **kwargs)
आईएमएचओ की जरूरत कुछ इस तरह है:
def _update(self, values, **kwargs):
v = self.get_version_field_value(values[0])
return self.get_query_set().filter(Q(version=v))._update(values, **kwargs)
इसी तरह की बात डिलीट पर होनी चाहिए। हालाँकि डिलीट करना थोड़ा और मुश्किल है क्योंकि Django इस क्षेत्र में django.db.models.deletion.Collector के माध्यम से काफी कुछ वूडू लागू कर रहा है।
यह अजीब है कि Django जैसे मामूली उपकरण में ऑप्टिक्टिक कॉन्सुरेंसी कंट्रोल के लिए मार्गदर्शन का अभाव है।
मैं इस पोस्ट को अपडेट करूंगा जब मैं पहेली को हल करूंगा। उम्मीद है कि समाधान एक अच्छे पाइथोनिक तरीके से होगा जिसमें टनिंग कोडिंग, अजीब विचार, जिराफ के आवश्यक टुकड़ों को छोड़ना आदि शामिल नहीं है।