2013-01-09 9 views
6

पर आधारित प्रत्येक कुंजी के पहले वापस लौटने के लिए प्रत्येक लेखक (विदेशी कुंजी से संबंधित) के लिए पहली पुस्तक (दिनांक क्षेत्र द्वारा) के साथ एक क्वेरीसेट प्राप्त करने की आवश्यकता है ... क्या एक Django ORM है ऐसा करने का तरीका (बिना कस्टम एसक्यूएल पसंदीदा लेकिन स्वीकार्य)Django पूछताछ दिनांक

* संपादित करें: कृपया ध्यान दें कि पोस्टग्रेस्क्ल जैसे आधुनिक ओपन सोर्स बैकएंड का उपयोग करने वाला एक उत्तर स्वीकार्य है .. शुद्ध कस्टम एसक्यूएल क्वेरी पर ओआरएम आधारित समाधान पसंद किया जाता है)

Models 
class Book(Model): 
    date = Datefield() 
    author = ForeignKey(Author) 

class Author(Model): 
    name = CharField() 


Book.objects.filter(??) 
+0

मेरे पास कल लगभग एक ही सवाल था http://stackoverflow.com/questions/14213333/get-latest-objects-django। EDIT 2 अनुभाग में मेरा वर्तमान हैक है। –

+0

ठीक है, मैं PostgreSQL पर हूं इसलिए मैं अलग-अलग पर सीमित नहीं हूं ... मुझे यकीन नहीं है कि मुझे आपके प्रश्न के आधार पर मेरा उत्तर मिल सकता है ... पॉइंटर्स के लिए धन्यवाद हालांकि – eskhool

उत्तर

6

आप PostgreSQL या DISTINCT ON लिए समर्थन के साथ एक और डीबी बैकएंड का उपयोग करते हैं वहाँ एक अच्छा समाधान है:

Books.objects.order_by('author', '-date').distinct('author') 

अन्यथा मुझे केवल एक प्रश्न के साथ समाधान नहीं पता है।() .values ​​के संयोजन और .annotate() हम समूह लेखक द्वारा साथ

from django.db.models import Q, Max 
import operator 

books = Book.objects.values('author_id').annotate(max_date=Max('date')) 
filters = reduce(operator.or_, [(Q(author_id=b['author_id']) & 
    Q(date=b['max_date'])) for b in books]) 
queryset = Books.objects.filter(filters) 

और उस लेखक की ओर से सभी पुस्तकों की नवीनतम तारीख व्याख्या: लेकिन आप इस कोशिश कर सकते हैं। लेकिन नतीजा एक नियम है और एक क्वेरीसेट नहीं है। फिर हम WHERE author_id=X1 AND date=Y1 OR author_id=X2 AND date=Y2... जैसे SQL कथन का निर्माण करते हैं। अब दूसरी क्वेरी आसान है।

+0

धन्यवाद, मुझे पता है 2 प्रश्नोत्तरी उत्तर ... यह संभवतया उत्तर होगा जो मैं अब तक विस्तार से स्वीकार करना चाहता हूं और सटीक प्रश्नों को संबोधित करता हूं, लेकिन मुझे अभी भी उम्मीद है कि कस्टम एसक्यूएल के साथ डीजेगो ओआरएम इसे एक में होने की अनुमति दे सकता है एकल प्रश्न – eskhool

+0

तो मुझे लगता है कि आप एक ही प्रश्न में सभी डीबी बैकएंड के लिए समाधान चाहते हैं? ऐसा कुछ: 'book.objects.raw (' SELECT *, MAX (date) max_date के रूप में max_date के रूप में word_id ') द्वारा '? – Hannes

+0

ने पोस्टग्रेस्क्ल केवल समाधान के लिए अपना प्रश्न अपडेट किया है ... फिर भी ओआरएम में आधारित समाधान पसंद करेगा, भले ही यह सभी बैकएंड पर काम न करे ... कस्टम एसक्यूएल सिर्फ आगे की श्रृंखला को और अधिक कठिन बना देगा – eskhool

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