django-reversion
पर एक नज़र डालें। यह Django मॉडल के लिए संस्करण नियंत्रण प्रदान करता है। मौजूदा परियोजना में आसानी से जोड़ा जा सकता है।
यह "वर्तमान" सूचक दृष्टिकोण को नियोजित नहीं करता है। इसके बजाए, यह हर बार ऑब्जेक्ट को क्रमबद्ध करता है जब इसे सहेजा जा रहा है और इसे इस ऑब्जेक्ट पर इंगित सामान्य विदेशी कुंजी के साथ अलग Version
मॉडल में संग्रहीत करता है। (रिलेशनशिप फ़ील्ड्स को डिफ़ॉल्ट रूप से प्राथमिक कुंजी के रूप में क्रमबद्ध किया जाता है।) इसके अलावा, यह Version
एस को Revision
एस में लचीला तरीके से समूहित करने की अनुमति देता है।
तो तुम ऐसा ही कुछ कर सकते हैं:
- उपयोगकर्ता अपलोड करता है सीएसवी, बस हमेशा की तरह परिवर्तनों को सहेजने के लिए, लेकिन समारोह जो करता
@revision.create_on_success
डेकोरेटर जोड़ने आयात ताकि द्वारा किए गए रिकॉर्ड में कोई भी परिवर्तन समारोह एक संशोधन के तहत संग्रहीत किया जाएगा।
- जब उपयोगकर्ता "पूर्ववत करें" हिट करता है, तो आप केवल नवीनतम संशोधन को वापस कर देते हैं।
यहाँ यह कैसे किया जा सकता है ::
@revision.create_on_success
def import_csv(request, csv):
# Old versions of all objects save()d here will
# belong to single revision.
def undo_last_csv_import(request):
# First, get latest revision saved by this user.
# (Assuming you create revisions only when user imports a CSV
# and do not version control other data.)
revision = Revision.objects.filter(user=request.user)\
.order_by('-date_created')[0]
# And revert it, delete=True means we want to delete
# any newly added records as well
revision.revert(delete=True)
यह तथ्य यह है कि आप संशोधन बनाने केवल जब उपयोगकर्ता आयात CSV में पर निर्भर करता है। इसका अर्थ यह है कि, यदि आप अन्य डेटा को संस्करण नियंत्रण भी करने की योजना बना रहे हैं, तो आपको किसी प्रकार का ध्वज लागू करने की आवश्यकता होगी जिसके द्वारा आप नवीनतम आयात से प्रभावित रिकॉर्ड प्राप्त कर सकते हैं। फिर आप इस ध्वज से एक रिकॉर्ड प्राप्त कर सकते हैं, इसे नवीनतम सहेजे गए संस्करण प्राप्त कर सकते हैं, और उस संस्करण के पूरे संशोधन को वापस कर सकते हैं। इस तरह ::
def undo_last_csv_import(request):
some_record = Record.objects.by_user(request.user).from_the_last_import()[0]
latest_saved_version_of_some_record = Version.objects.get_for_date(
some_record,
datetime.now(), # The latest saved Version at the moment.
)
# Revert all versions that belong to the same revision
# as the version we got above.
latest_saved_version_of_some_record.revision.revert()
यह एक सुंदर समाधान नहीं है, निश्चित रूप से इस ऐप के साथ बेहतर तरीके से करने के तरीके हैं। मैं बेहतर समझने के लिए कोड को देखने की सलाह देता हूं कि django-reversion
कैसे काम करता है-बहुत अच्छी तरह से प्रलेखित, डॉकस्ट्रिंग के बिना कोई फ़ंक्शन नहीं मिला।^_^घ
(प्रलेखन भी अच्छा है, लेकिन पता चला थोड़ा मेरे लिए भ्रामक, यानी वे Version.objects.get_for_date(your_model, date)
लिखते हैं, जहां your_model वास्तव में एक मॉडल के उदाहरण है किया जाना है।)
अद्यतन: Django-प्रत्यावर्तन सक्रिय रूप से बनाए रखा जाता है, इसलिए ऊपर दिए गए कोड पर भरोसा न करें, और wiki को बेहतर तरीके से जांचें कि संस्करण & django के व्यवस्थापक के बाहर संशोधन कैसे प्रबंधित करें। उदाहरण के लिए, संशोधन टिप्पणियां पहले ही समर्थित हैं, जो चीजों को थोड़ा सा सरल बना सकती हैं।