2010-09-02 8 views
13

द्वारा डीजेगो क्वेरीसेट कस्टम ऑर्डरिंग आईडी/पीक्स की एक सूची को देखते हुए, मैं सूची में इंडेक्स द्वारा आदेशित वस्तुओं के QuerySet उत्पन्न करना चाहता हूं।आईडी

आम तौर पर मैं के साथ शुरू होता है:

pk_list = [5, 9, 2, 14] 
queryset = MyModel.objects.filter(pk__in=pk_list) 

निश्चित रूप से यह वस्तुओं दिखाए, लेकिन मॉडल मेटा आदेश संपत्ति के क्रम में, और मैं pk रों के क्रम में रिकॉर्ड प्राप्त करने के लिए इच्छा pk_list में।

अंतिम परिणाम, एकQuerySet वस्तु (नहीं एक सूची) होने के लिए के रूप में मैं Django के ModelMultipleChoiceField फॉर्म फील्ड करने का आदेश दिया QuerySet पारित करने के लिए इच्छा है।

+1

db स्तर पर MySQL और PostgreSQL के लिए: http://blog.mathieu-leplatre.info/django-create-a-queryset-from-a-list-preserving-order.html – Medorator

उत्तर

1

मुझे फ़िल्टर स्थिति का उपयोग करके ऐसा करने का कोई तरीका नहीं पता है। यदि आपका डेटाबेस IN खंड के क्रम में पंक्तियों को वापस कर देगा तो आप प्राप्त करने के लिए अपने डेटाबेस द्वारा प्रदत्त ROWNUM के साथ Django की extra विधि को गठबंधन करने में सक्षम हो सकते हैं।

उदाहरण के लिए .:

queryset = MyModel.objects.filter(pk__in=[pk_list]).extra(
     select: {'rownum': 'row_num()'}).order_by('rownum') 

कहाँ row_num() एक डेटाबेस समारोह है कि वर्तमान पंक्ति की पंक्ति संख्या देता है माना जाता है। Postgresql 8.4+ row_num() का समर्थन करता है लेकिन मुझे नहीं पता कि IN खंड में मानों के समान क्रम का उपयोग करके पंक्तियों को कैसे क्रमबद्ध किया जाए।

मुझे लगता है कि उप-वर्ग ModelMultipleChoiceField के लिए एक बेहतर तरीका होगा और प्रतिपादन करते समय कस्टम सॉर्टिंग तर्क जोड़ें।

+0

इसके लिए धन्यवाद, लेकिन मुझे कुछ ऐसा चाहिए जो स्क्लाइट और माइस्क्ल दोनों के साथ संगत होगा। मुझे लगता है कि मैं 'एकाधिकChoiceField' का उपयोग करके और विकल्पों की सूची उत्पन्न करने के साथ जाऊंगा। –

7

ऐसा करने का एक अंतर्निहित तरीका नहीं है।

यदि आप MySQL का उपयोग कर रहे हैं, तो आप उस मॉडल के FIELD() फ़ंक्शन का उपयोग अपने मॉडल पर एक कस्टम ऑर्डरिंग अनुक्रम स्थापित करने के लिए कर सकते हैं, और उसके द्वारा क्रमबद्ध करें। यह काम करेगा:

pk_list = [5, 9, 2, 14] 
ordering = 'FIELD(`id`, %s)' % ','.join(str(id) for id in pk_list) 
queryset = MyModel.objects.filter(pk__in=[pk_list]).extra(
       select={'ordering': ordering}, order_by=('ordering',)) 
+0

इसके लिए धन्यवाद, लेकिन मुझे कुछ ऐसा चाहिए जो स्क्लाइट और माइस्क्ल दोनों के साथ संगत होगा। मुझे लगता है कि मैं 'एकाधिकChoiceField' का उपयोग करके और विकल्पों की सूची उत्पन्न करने के साथ जाऊंगा। –

+0

प्रतीक्षा करें, 'order_by =' pk'' काम नहीं करता है? – amirouche

+1

@amirouche, नहीं, वह इसे सरल संख्यात्मक क्रम से पूरी तरह से एक आदेश में चाहता है। – LarrikJ