2011-09-09 16 views
14

में व्यवस्था बनाए रखने के नहीं है मुझे किसी विशिष्ट आदेशDjango: __in क्वेरी देखने querset

>>> album_ids = [24, 15, 25, 19, 11, 26, 27, 28] 
>>> albums = Album.objects.filter(id__in=album_ids, published= True) 
>>> [album.id for album in albums] 
[25, 24, 27, 28, 26, 11, 15, 19] 

मैं album_ids में पहचान-पत्र के रूप में इसी क्रम में क्वेरीसमूह में एलबम की जरूरत है पहचान पत्र है। कोई भी कृपया मुझे बताएं कि मैं आदेश कैसे बनाए रख सकता हूं? या एलबम_ids में एल्बम प्राप्त करें?

उत्तर

13

ID की सूची मान लिया जाये कि बहुत बड़ी नहीं है, तो आप अजगर में एक सूची में क्यूएस परिवर्तित कर सकते हैं और सॉर्ट यह:

album_list = list(albums) 
album_list.sort(key=lambda album: album_ids.index(album.id)) 
+0

मेरे पास बड़ा डेटाबेस है, आईडी लाखों में हो सकता है – Ahsan

+0

बस भविष्य के संदर्भ के लिए, मुझे लगता है कि आईडी का लाखों लोग अधिकांश अनुप्रयोगों में प्रासंगिक नहीं हैं क्योंकि हम आर ऐसी जानकारी की मात्रा को लोड करने की ज़रूरत है। इसके बजाए, आप django-pagination का उपयोग कर सकते हैं जो प्रदर्शित करने के लिए आवश्यक राशि को लोड करता है और बेहतर उपयोगकर्ता अनुभव के लिए बनाता है। –

+1

यह एक अच्छा समाधान है, लेकिन QuerySet को इस पर काम करने के लिए इसे कैसे रखा जाए? –

9

आप ORM के माध्यम से Django में यह नहीं कर सकते। लेकिन यह अपने आप से लागू करने के लिए काफी सरल है:

album_ids = [24, 15, 25, 19, 11, 26, 27, 28] 
albums = Album.objects.filter(published=True).in_bulk(album_ids) # this gives us a dict by ID 
sorted_albums = [albums[id] for id in albums_ids if id in albums] 
17

Djnago 1.8 जब से तुम इस तरह से कर सकते हैं

from django.db.models import Case, When 

pk_list = [10, 2, 1] 
preserved = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(pk_list)]) 
queryset = MyModel.objects.filter(pk__in=pk_list).order_by(preserved) 
+2

यह बहुत अच्छा लगता है क्योंकि अंतिम परिणाम एक क्वेरीसेट है जो सूचियों का उत्पादन करने वाले अन्य उत्तरों के विपरीत है। –

+0

सबसे अच्छा जवाब! धन्यवाद अरुण! – nextdoordoc

1

आप extra क्वेरीसमूह संशोधक

>>> album_ids = [24, 15, 25, 19, 11, 26, 27, 28] 
>>> albums = Album.objects.filter(id__in=album_ids, published= True 
      ).extra(select={'manual': 'FIELD(id,%s)' % ','.join(map(str, album_ids))}, 
        order_by=['manual']) 
का उपयोग कर ORM के माध्यम से Django में कर सकते हैं
संबंधित मुद्दे