मैं Django का उपयोग करके संग्रहीत उपयोगकर्ताओं द्वारा संपादित किए गए बड़े टेक्स्ट फ़ील्ड का पूरा इतिहास प्राप्त करना चाहता हूं।Django में टेक्स्ट पूर्ण इतिहास कैसे करें?
मैंने देखा है परियोजनाओं:
मैं एक विशेष यूज-केस कि शायद के दायरे से बाहर गिर जाता है क्या ये परियोजनाएं प्रदान करती हैं। इसके अलावा, मैं इस परियोजना से कितनी अच्छी तरह से दस्तावेज, परीक्षण और अद्यतन किया गया है, इस बारे में सावधान हूं। किसी भी घटना में, यहाँ समस्या मैं का सामना करना पड़ता है:
मैंने एक मॉडल, likeso:
from django.db import models
class Document(models.Model):
text_field = models.TextField()
यह पाठ क्षेत्र बड़ा हो सकता है - 40k से अधिक - और मैं एक स्वतः सहेजना विशेषता यह है कि बचाता है करना चाहते हैं क्षेत्र हर 30 सेकंड या तो। यह डाटाबेस को अनावश्यक रूप से बड़ा कर सकता है, जाहिर है, अगर 40k प्रत्येक पर बहुत से बचाता है (शायद ज़ेड होने पर शायद 10k)। सबसे अच्छा समाधान जो मैं सोच सकता हूं वह सबसे हालिया सहेजे गए संस्करण और नए संस्करण के बीच अंतर रखना है।
हालांकि, मैं समांतर अद्यतनों वाली दौड़ स्थितियों के बारे में चिंतित हूं।
HTTP लेन-देन रेस स्थिति:: वहाँ दो अलग-अलग जाति की स्थिति है कि (दूसरा और अधिक गंभीर पहले की तुलना में) मन में आते हैं उपयोगकर्ता A और उपयोगकर्ता B अनुरोध दस्तावेज़ X 0 और व्यक्तिगत रूप से उत्पादन परिवर्तन करते हैं, एक्सए और एक्सबी। एक्सए बचाया गया है, एक्स 0 और एक्सए के बीच का अंतर "एक्सए -0" ("कम नहीं") है, एक्सए अब डेटाबेस में आधिकारिक संस्करण के रूप में संग्रहीत किया जा रहा है। यदि एक्सबी बाद में बचाता है, तो यह एक्सए को ओवरराइट करता है, एक्सबी-ए ("बी कम ए") होता है।
आदर्श नहीं होने पर, मैं इस व्यवहार से अत्यधिक चिंतित नहीं हूं। दस्तावेज़ एक-दूसरे को ओवरराइट कर रहे हैं, और उपयोगकर्ता ए और बी एक-दूसरे से अनजान हो सकते हैं (प्रत्येक दस्तावेज़ X0 से शुरू हुआ है), लेकिन इतिहास अखंडता को बरकरार रखता है।
डाटाबेस पढ़ने की स्थिति/अद्यतन स्थिति: समस्याग्रस्त दौड़ की स्थिति तब होती है जब Xa और Xb X0 पर एक ही समय में सहेजते हैं। वहाँ हो जाएगा (छद्म) कोड कुछ की तरह:
def save_history(orig_doc, new_doc): text_field_diff = diff(orig_doc.text_field, new_doc.text_field) save_diff(text_field_diff)
Xa हैं और Xb दोनों (यानी orig_doc X 0 है) डेटाबेस से X 0 पढ़ते हैं, अपने मतभेदों Xa -0 और XB-0 (के रूप में करने का विरोध किया हो जाएगा धारावाहिक Xa-0 तब एक्सबी-ए, या समकक्ष एक्सबी -0 फिर एक्सए-बी)। जब आप इतिहास का उत्पादन करने के लिए अलग-अलग पैच को पैच करने का प्रयास करते हैं, तो यह पैच Xa-0 या Xb-0 (जो दोनों X0 पर लागू होते हैं) पर असफल हो जाएंगे। इतिहास की अखंडता से समझौता किया गया है (या यह है?)।
एक संभावित समाधान एक स्वचालित सुलह एल्गोरिदम है, जो इन समस्याओं का पता लगाता है पूर्व-पोस्ट। यदि इतिहास का पुनर्निर्माण विफल रहता है, तो कोई यह मान सकता है कि एक दौड़ की स्थिति आई है, और जब तक यह सफल नहीं हो जाता तब तक इतिहास के पूर्व संस्करणों में असफल पैच लागू करें।
मुझे इस समस्या से निपटने के तरीके के बारे में कुछ प्रतिक्रिया और सुझाव मिलने से प्रसन्नता होगी।
संयोग से, यह पता उपयोगी होता है insofar के रूप में, मैं पाया है कि Django atomicity यहाँ पर चर्चा की है:
- Django: How can I protect against concurrent modification of data base entries, और यहाँ:
- Atomic operations in Django?
तुम कृपया धन्यवाद।
कोई पूरा उत्तर नहीं है इसलिए मैं इसे टिप्पणियों में डाल दूंगा। Django RCS फ़ील्ड को देखने की कोशिश करें: http://code.google.com/p/django-rcsfield/ फ़ील्ड को प्रबंधित करने के लिए यह संस्करण नियंत्रण प्रणाली है। इसे काम करने पर आलेख: http://lethain.com/entry/2008/oct/15/setting-up-django-rcsfield/ –