2016-09-06 7 views
6

मैं कुछ मॉडलों के साथ काम कर रहा हूं जिन्हें मॉडल फ़ील्ड का योग वापस करना है। क्या मॉडल पर सेव विधि को ओवरराइड करना बेहतर है या सिर्फ एक कस्टम विधि बनाएं जो योग देता है। क्या समाधान में से कोई प्रदर्शन समस्या है?Django मॉडल, संपत्ति के साथ बचत विधि या कस्टम विधि को ओवरराइड करना

विकल्प 1: सहेजने की विधि को ओवरराइड करना।

class SomeModel(models.Model): 
    integer1 = models.IntegerField() 
    integer2 = models.IntegerField() 
    integer3 = models.IntegerField() 

    sum_integers = models.IntegerField() 

    def save(self, *args, **kwargs): 
     self.sum_integers = sum(
      [self.integer1, self.integer2, self.integer3]) 
     self.sum_integers.save() 
     return super(SomeModel, self).save(*args, **kwargs) 

विकल्प 2: कस्टम विधि

class SomeModel(models.Model): 
    integer1 = models.IntegerField() 
    integer2 = models.IntegerField() 
    integer3 = models.IntegerField() 

    @property 
    def sum_integers(self): 
     return sum([self.integer1, self.integer2, self.integer3]) 

उत्तर

2

जवाब जिस तरह से आप sum_integers उपयोग करने के लिए जा रहे हैं पर निर्भर करता है। यदि आप इसे डीबी में एक क्षेत्र के रूप में रखते हैं, तो आप इस पर एक प्रश्न पूछ सकेंगे, और संपत्ति के साथ यह बहुत मुश्किल होगा।

दूसरी तरफ, यदि आप कोई प्रश्न नहीं उठा रहे हैं और यह डेटा आपके लिए मूल्यवान नहीं है (दूसरे शब्दों में - आपको डेटा प्रतिनिधित्व के रूप में sum_integers की आवश्यकता है) तो आपको संपत्ति के साथ जाना चाहिए।

आवेदन प्रदर्शन के दृष्टिकोण से: आप वस्तुओं के हजारों पर जटिल आपरेशनों बनाने के लिए जा रहे हैं - यह या cached_property के स्तंभ में मान कम से कम परिवर्तन संपत्ति स्टोर करने के लिए बेहतर हो सकता है अगर यह कई बार कहा जाता है ।

सारांश के रूप में - डीबी कॉलम में योग का भंडारण मूल्य अधिक सार्वभौमिक है और इसमें कोई गिरावट नहीं है, लेकिन कुछ मामलों में property दृष्टिकोण आपको अपने डेटा मॉडल क्लीनर को रखने और आपकी डिस्क पर कुछ स्थान सहेजने की अनुमति देता है।

मुझे आशा है कि यह आपके प्रश्न का उत्तर है। अगर कुछ अस्पष्ट है तो कृपया प्रश्न पूछने के लिए स्वतंत्र भरें।

+0

धन्यवाद, पेशेवरों और विपक्ष का अच्छा स्पष्टीकरण। – Andreas

2

इस बात पर निर्भर करता है कि आपको फ़ील्ड को अधिक अपडेट करना है या योग को और अधिक कॉल करना है या नहीं।

मुझे लगता है कि यह अधिक सामान्य बनाने के लिए, ऑपरेशन न केवल अतिरिक्त है बल्कि बड़ी संख्या में जटिल जटिल गणना शामिल है।

यदि आपको अब और फिर योग मिलना है, तो मॉडल मॉडल बनाने और सहेजने पर मूल्य जोड़ने के लिए बेहतर है।

यदि आपको इसे अधिकतर अपडेट करना है, तो आम तौर पर कॉल पर मूल्य प्राप्त करना (दूसरी विधि) अधिक उपयुक्त है।

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