आप के लिए एक त्वरित heres:
मेरे पास आईडी की एक सूची है, जिसका उपयोग मैं एक क्वेरीसेट (या यदि आवश्यक हो तो सरणी) को वापस करने के लिए करना चाहता हूं, लेकिन मैं उस आदेश को बनाए रखना चाहता हूं।
धन्यवाद
जवाबों:
मुझे नहीं लगता कि आप डेटाबेस स्तर पर उस विशेष आदेश को लागू कर सकते हैं, इसलिए आपको इसके बजाय अजगर में करने की आवश्यकता है।
id_list = [1, 5, 7]
objects = Foo.objects.filter(id__in=id_list)
objects = dict([(obj.id, obj) for obj in objects])
sorted_objects = [objects[id] for id in id_list]
यह कुंजी के रूप में उनकी आईडी के साथ वस्तुओं का एक शब्दकोश बनाता है, इसलिए क्रमबद्ध सूची का निर्माण करते समय उन्हें आसानी से पुनर्प्राप्त किया जा सकता है।
Django 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)
Case Whenअंडर हैं!
distinct()जब मैं खंड के साथ order_by मामले का उपयोग करने जा रहा हूं, लेकिन त्रुटि मिली। किसी भी समर्थन, कृपया।
SELECT DISTINCT ON expressions must match initial ORDER BY expressions- यहाँ त्रुटि संदेश है
यदि आप in_bulk का उपयोग करके ऐसा करना चाहते हैं, तो आपको वास्तव में ऊपर दिए गए दो उत्तरों को मर्ज करने की आवश्यकता है:
id_list = [1, 5, 7]
objects = Foo.objects.in_bulk(id_list)
sorted_objects = [objects[id] for id in id_list]
अन्यथा परिणाम एक विशेष रूप से आदेशित सूची के बजाय एक शब्दकोश होगा।
यहां डेटाबेस स्तर पर इसे करने का एक तरीका है। कॉपी पेस्ट से: blog.mathieu-leplatre.info :
MySQL :
SELECT *
FROM theme
ORDER BY FIELD(`id`, 10, 2, 1);
Django के साथ भी:
pk_list = [10, 2, 1]
ordering = 'FIELD(`id`, %s)' % ','.join(str(id) for id in pk_list)
queryset = Theme.objects.filter(pk__in=[pk_list]).extra(
select={'ordering': ordering}, order_by=('ordering',))
PostgreSQL :
SELECT *
FROM theme
ORDER BY
CASE
WHEN id=10 THEN 0
WHEN id=2 THEN 1
WHEN id=1 THEN 2
END;
Django के साथ भी:
pk_list = [10, 2, 1]
clauses = ' '.join(['WHEN id=%s THEN %s' % (pk, i) for i, pk in enumerate(pk_list)])
ordering = 'CASE %s END' % clauses
queryset = Theme.objects.filter(pk__in=pk_list).extra(
select={'ordering': ordering}, order_by=('ordering',))
id_list = [1, 5, 7]
objects = Foo.objects.filter(id__in=id_list)
sorted(objects, key=lambda i: id_list.index(i.pk))