2008-10-04 23 views
61

मुझे इसके चारों ओर अपने सिर को लपेटने में परेशानी हो रही है। अभी मैं कुछ मॉडल है कि इस तरह तरह का दिखता है:Django सिग्नल बनाम ओवरराइडिंग विधि

def Review(models.Model) 
    ...fields... 
    overall_score = models.FloatField(blank=True) 

def Score(models.Model) 
    review = models.ForeignKey(Review) 
    question = models.TextField() 
    grade = models.IntegerField() 

एक समीक्षा कई "स्कोर" है, overall_score स्कोर के औसत है। जब कोई समीक्षा या स्कोर सहेजा जाता है, तो मुझे total_score औसत को फिर से समझना होगा। अभी मैं एक ओवरराइड सेव विधि का उपयोग कर रहा हूं। Django के सिग्नल प्रेषक का उपयोग करने के लिए कोई लाभ होगा?

उत्तर

67

सिग्नल सहेजें/हटाएं आमतौर पर उन परिस्थितियों में अनुकूल होते हैं जहां आपको ऐसे परिवर्तन करने की आवश्यकता होती है जो मॉडल में पूरी तरह से विशिष्ट नहीं हैं, या उन मॉडलों पर लागू किया जा सकता है जिनमें कुछ सामान्य है, या पूरे उपयोग के लिए कॉन्फ़िगर किया जा सकता है मॉडल के।

ओवरराइड save विधियों में एक आम कार्य मॉडल में कुछ टेक्स्ट फ़ील्ड से स्लग की स्वचालित पीढ़ी है। यह कुछ ऐसा उदाहरण है, यदि आपको इसे कई मॉडलों के लिए लागू करने की आवश्यकता है, तो pre_save सिग्नल का उपयोग करने से लाभ होगा, जहां सिग्नल हैंडलर स्लग फ़ील्ड का नाम ले सकता है और स्लग उत्पन्न करने के लिए फ़ील्ड का नाम ले सकता है । एक बार जब आपके पास ऐसा कुछ हो, तो आपके द्वारा रखी गई कोई भी उन्नत कार्यक्षमता सभी मॉडलों पर भी लागू होगी - उदा। विशिष्टता सुनिश्चित करने के लिए, प्रश्न में मॉडल के प्रकार के लिए जोड़ने के लिए आप जिस स्लग को जोड़ रहे हैं उसे देख रहे हैं।

पुन: प्रयोज्य अनुप्रयोगों को अक्सर संकेतों के उपयोग से लाभ होता है - यदि वे जो कार्यक्षमता प्रदान करते हैं उन्हें किसी भी मॉडल पर लागू किया जा सकता है, वे आम तौर पर (जब तक यह अपरिहार्य नहीं है) नहीं चाहते हैं कि उपयोगकर्ताओं को लाभ के लिए अपने मॉडल को सीधे संशोधित करना पड़े यह।

django-mptt के साथ, उदाहरण के लिए, मैं pre_save संकेत क्षेत्रों जो मॉडल है जो के बारे में बनाया है या अद्यतन करने की है के लिए एक वृक्ष संरचना का वर्णन का एक सेट और pre_delete संकेत प्रबंधन करने के लिए वस्तु होने के लिए वृक्ष संरचना विवरण निकालने के लिए किया हटा दिया गया है और इसके पहले ऑब्जेक्ट्स का पूरा उप-पेड़ इससे पहले और वे हटा दिए गए हैं। सिग्नल के उपयोग के कारण, उपयोगकर्ताओं को उनके प्रबंधन के लिए save या delete विधियों को जोड़ने या संशोधित करने की आवश्यकता नहीं है, उन्हें सिर्फ django-mptt को यह पता होना है कि वे कौन से मॉडल प्रबंधित करना चाहते हैं।

3

यदि आप सिग्नल का उपयोग करेंगे तो आप प्रत्येक बार संबंधित स्कोर मॉडल सहेजे जाने पर समीक्षा स्कोर अपडेट करने में सक्षम होंगे। लेकिन अगर ऐसी कार्यक्षमता की आवश्यकता नहीं है तो मुझे इसे सिग्नल में रखने का कोई कारण नहीं दिखता है, यह सुंदर मॉडल से संबंधित सामान है।

2

यह एक तरह का denormalisation है। इस pretty solution पर देखें। जगह में संरचना क्षेत्र परिभाषा।

-20

सिग्नल उपयोगी होते हैं जब आपको कुछ दीर्घकालिक प्रक्रिया निष्पादित करनी होती है और अपने उपयोगकर्ता को पूरा करने के लिए प्रतीक्षा करने के लिए अवरुद्ध नहीं करना चाहते हैं।

+8

नहीं है, संकेत ब्लॉक जब तक आप धागे को स्पष्ट रूप से अंडे। – muhuk

+8

@ मुहुक सही है, संकेत आपकी प्रक्रियाओं को अवरुद्ध करते हैं। यदि आप अवरुद्ध प्रक्रियाओं से बचना चाहते हैं तो गीवेंट, अजवाइन, या अन्य असीमित उपकरण जैसे टूल का उपयोग करें। – pydanny

+1

मैं इसे मुहुक और पाइडनी के बिंदुओं के कारण -1 देता हूं। ऐसा लगता है कि यह पूरी तरह से गलत सलाह है। अनुरोध तब तक खत्म नहीं होगा जब तक सिग्नल प्रोसेसिंग नहीं की जाती। तो अजवाइन एक अच्छा समाधान की तरह लगता है, जो मैं आमतौर पर अपने django परियोजनाओं में उपयोग करता हूं। –

11

आप से पूछा:

वहाँ Django के संकेत डिस्पैचर उपयोग करने के लिए किसी भी लाभ होगा?

मैं Django डॉक्स में इस पाया:

ओवरराइड मॉडल तरीकों थोक संचालन पर बुलाया नहीं कर रहे हैं

नोट है कि एक वस्तु के लिए हटाना() विधि जरूरी जब को हटाने वस्तुओं नहीं कहा जाता है एक क्वेरीरीसेट का उपयोग करके थोक में या कैस्केडिंग डिलीट के परिणामस्वरूप।यह सुनिश्चित करने के लिए कि अनुकूलित डिलीट तर्क निष्पादित हो जाता है, आप pre_delete और/या post_delete संकेतों का उपयोग कर सकते हैं।

दुर्भाग्य से, वहाँ नहीं एक समाधान बनाने या थोक में वस्तुओं को अपडेट करते समय, बचाने में से कोई भी के बाद से है(), pre_save, और post_save कहा जाता है।

से: Overriding predefined model methods

+2

Django व्यवस्थापक सूची दृश्य थोक डिलीट का उपयोग करता है ... इस टिड्बी में आने तक उलझन में था। –

+0

यह भी कहता है "दुर्भाग्यवश, थोक में ऑब्जेक्ट्स बनाते या अपडेट करते समय कोई कामकाज नहीं होता है, क्योंकि कोई भी सहेजने(), pre_save, और post_save को कॉल नहीं किया जाता है।" - इसलिए मुझे नहीं लगता कि यह इन तरीकों के बीच एक व्यापार है। – Cory

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