PostgreSQL डीबी के साथ Django 11 का उपयोग करना। मेरे पास नीचे दिखाए गए मॉडल हैं। मैं किसी विशेषता को निर्दिष्ट किए बिना Prefetch ऑब्जेक्ट और prefetch_related का उपयोग करके संबंधित क्वेरीसेट को प्रीफ़ेच करने का प्रयास कर रहा हूं।

class Person(Model):
    name = Charfield()

    @property
    def latest_photo(self):
        return self.photos.order_by('created_at')[-1]

class Photo(Model):
    person = ForeignKey(Person, related_name='photos')
    created_at = models.DateTimeField(auto_now_add=True)


first_person = Person.objects.prefetch_related(Prefetch('photos', queryset=Photo.objects.order_by('created_at'))).first()

first_person.photos.order_by('created_at') # still hits the database
first_person.latest_photo # still hits the database

आदर्श स्थिति में, person.latest_photo को कॉल करना डेटाबेस को फिर से हिट नहीं करेगा। यह मुझे उस संपत्ति को सूची प्रदर्शन में सुरक्षित रूप से उपयोग करने की अनुमति देगा। हालांकि, जैसा कि कोड में टिप्पणियों में उल्लेख किया गया है, जब मैं नवीनतम फोटो प्राप्त करने का प्रयास करता हूं तो प्रीफेच किए गए क्वेरीसेट का उपयोग नहीं किया जा रहा है। ऐसा क्यों है?

नोट: मैंने Prefetch के to_attr तर्क का उपयोग करने का प्रयास किया है और यह काम करता प्रतीत होता है, हालांकि, यह आदर्श नहीं है क्योंकि इसका मतलब है कि मुझे latest_photo prefetched विशेषता का उपयोग करने का प्रयास करने के लिए।

1
Thomas Martres 19 अप्रैल 2018, 23:00

1 उत्तर

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

समस्या टुकड़ा करने की क्रिया के साथ है, यह एक अलग क्वेरी बनाता है।

आप इसके आसपास इस तरह काम कर सकते हैं:

    ...

    @property
    def latest_photo(self):
        first_use_the_prefetch = list(self.photos.order_by('created_at'))
        then_slice = first_use_the_prefetch[-1]
        return then_slice

और यदि आप कोशिश करना चाहते हैं, तो प्रीफेच के अंदर स्लाइसिंग का उपयोग करना संभव नहीं है (क्वेरी = ... यहां कोई टुकड़ा नहीं है ...) (इसके लिए Django ट्रैकर में कहीं न कहीं एक अभ्यस्त सुविधा अनुरोध है)।

0
Bob 21 अप्रैल 2018, 12:51