2013-03-25 7 views
10

मान लें कि आप अपने द्वारा बनाए गए एप्लिकेशन में बड़े बदलावों के लिए एक परीक्षण वातावरण सेट अप करना चाहते हैं, और आप यह सुनिश्चित करना चाहते हैं कि आपके सिस्टम में मौजूद डेटा आसानी से नए में लोड हो जाएंगे प्रणाली।क्या लोडडाटा पोस्ट_सेव सिग्नल को अनदेखा या अक्षम करता है

Django डेटा निर्यात और लोड करने के लिए कमांड लाइन सुविधाएं प्रदान करता है। वाया dumpdata और loaddata

python manage.py dumpdata app.Model > Model.json 
python manage.py loaddata Model.json 

प्रलेखन, की पहचान करता है (हालांकि नहीं स्पष्ट रूप से) है कि कुछ संकेत इस प्रक्रिया के दौरान अनदेखी कर रहे हैं:

जब स्थिरता फ़ाइलों कार्रवाई की जाती है, डेटा डेटाबेस में सहेजा जाता है है के रूप में । मॉडल परिभाषित सहेजने के तरीकों और pre_save संकेतों को बुलाया नहीं जाता है। (source)

वहाँ loaddata प्रक्रिया के दौरान post_save संकेत कॉल निष्क्रिय करने के लिए कोई तरीका है?

संभवतः संबंधित:

+0

संभावित डुप्लिकेट [मैं डीजेंगो पोस्ट \ _ सेव सिग्नल कोड के साथ विवाद से फिक्स्चर को कैसे रोकूं?] (Http://stackoverflow.com/questions/3499791/how-do-i-prevent-fixtures-from-conflicting- साथ-django-post-save-signal-code) – Louis

उत्तर

24

एक तरह से इस लक्ष्य को हासिल करने के लिए जब संकेत अपने रिसीवर कार्य करने के लिए भेजा जाता है एक डेकोरेटर कि कच्चे कीवर्ड तर्क के लिए लग रहा है जोड़ने के लिए है । इसने Django 1.4.3 पर मेरे लिए अच्छा काम किया है, मैंने 1.5 पर इसका परीक्षण नहीं किया है, लेकिन इसे अभी भी काम करना चाहिए।

from functools import wraps 
def disable_for_loaddata(signal_handler): 
    """ 
    Decorator that turns off signal handlers when loading fixture data. 
    """ 

    @wraps(signal_handler) 
    def wrapper(*args, **kwargs): 
     if kwargs.get('raw'): 
      return 
     signal_handler(*args, **kwargs) 
    return wrapper 

तब:

@disable_for_loaddata 
def your_fun(**kwargs): 
    ## stuff that won't happen if the signal is initiated by loaddata process 

डॉक्स के अनुसार, कच्चे कीवर्ड है: यह सच है कि क्या मॉडल वास्तव में सहेजा जाता है के रूप में (अर्थात् जब एक दृढ़ लोड हो रहा है) प्रस्तुत किया।

+0

तो यह फ़ंक्शन के लिए सजावटी के रूप में कार्य करेगा, या post_save.connect() पर? –

+1

@ ब्रैंडनबर्टेलसन फ़ंक्शन के लिए, क्योंकि यह एक फ़ंक्शन सजावट है। –

+0

अभी भी Django 1.8 में काम करता है (हालांकि मैंने 'functools' निर्भरता को हटा दिया है) – GergelyPolonkai

संबंधित मुद्दे