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

विकल्प 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])
8
Andreas 6 सितंबर 2016, 20:15

2 जवाब

सबसे बढ़िया उत्तर

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

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

आवेदन प्रदर्शन के बिंदु से: यदि आप हजारों वस्तुओं पर जटिल संचालन करने जा रहे हैं - तो मान को कॉलम में संग्रहीत करना या कम से कम संपत्ति को cached_property अगर इसे कुछ बार कहा जाता है।

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

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

4
Andrey Rusanov 6 सितंबर 2016, 20:52

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

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

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

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

2
sprksh 6 सितंबर 2016, 23:04