Django

2012-06-06 6 views
12

में prefetch_related पर फ़िल्टर करें prefetched वस्तुओं को फ़िल्टर करने का कोई तरीका है? मुझे prefetched ऑब्जेक्ट्स का नवीनतम() प्राप्त करने की आवश्यकता है, लेकिन अगर आप नवीनतम उपयोग करते हैं तो prefetch_related काम नहीं करता है क्योंकि क्वेरी बदल दी गई है?Django

यहाँ उदाहरण मैं क्या आवश्यकता है, लेकिन मैं वहाँ एक सरल समाधान का है उम्मीद कर रहा था ...

https://github.com/ionelmc/django-prefetch#example

उत्तर

4

यह बहुत ही सरल विधि है जो उन लोगों के अनुप्रयोग के साथ शायद ही बराबर है है, लेकिन उम्मीद है आप इसे मिलेगा उपयोगी:

class Author(models.Model): 
    name = models.CharField(max_length=100) 

    def latest_book(self): 
     return max(self.book_set.all(), key=lambda book: book.created) 

authors = Author.objects.prefetch_related('book_set') 
authors[0].latest_book() # what you wanted 
+1

मैंने इसका परीक्षण किया और ऐसा लगता है कि यह बेवकूफ लूप के समान प्रश्न उत्पन्न करता है ... मुझे नहीं लगता कि आप रिवर्स रिलेशन – alan

+2

पर select_related का उपयोग कर सकते हैं मुझे खेद है - बेशक यह prefetch_related होना चाहिए (मैंने अपना जवाब संपादित किया)। सभी के साथ इस छेद सेट का उपयोग करना() prefetched और iterating यह डेटाबेस हिट नहीं करना चाहिए। – jasisz

1

हाँ, यह इस तरह से किया जा सकता है:

authors=Author.objects.prefetch_related('book_set') 

आप एक विशेषता (नाम) के आधार पर फ़िल्टर करने के लिए लेखक मॉडल में मौजूद चाहते हैं तो आप बस लेखन से यह फ़िल्टर कर सकते हैं:

authors.filter(name='your_value') 

लेकिन अगर आप पुस्तकें मॉडल पर फ़िल्टर लागू करना चाहते आप नीचे दिए तरीक़े लिखने के लिए है:

authors.filter(book__created__gt='your_date') 

यह होगा च अपनी तिथि से अधिक की तारीख वाली सभी पुस्तकों को शामिल करें (बुक मॉड्यूल में बनाई गई विशेषता)।