سؤال

أحضر أحدث صفوف 5 صفوف من نموذج FOO الذي أمر به حقل DateTime.

qs = Foo.objects.all()[:5]

في الخطوة التالية، أريد إعادة ترتيب Queryset بواسطة بعض المعايير الأخرى (في الواقع، من خلال حقل DateTime نفسه في الاتجاه المعاكس). لكن إعادة ترتيب بعد شريحة غير مسموح بها. عكس () يزرف عن النظام الأول، مما يمنحي استعراضا مخفرا. هل هناك طريقة لإنجاز ما أريد دون إنشاء قائمة من QuerySet والقيام بالطلب باستخدامه؟

هل كانت مفيدة؟

المحلول

لا، لا توجد طريقة للقيام بذلك. order_by هي عملية في قاعدة البيانات، ولكن عند شريحة QuerySet يتم تقييمها ولا تعود إلى قاعدة البيانات بعد ذلك.

يبدو أنك تعرف بالفعل الحل، على الرغم من: تشغيل reversed() على QS تقييمها.

qs = reversed(Foo.objects.all()[:5])

نصائح أخرى

order_by يمنحك ترتيب SQL في قاعدة البيانات. أنت بالفعل تستخدم ذلك، ثم تشريح عليه. في هذه المرحلة، يتم استرداد النتائج في الذاكرة. إذا كنت ترغب في تغيير طلبها، فأنت بحاجة إلى استخدام فرز Python في الذاكرة للقيام بذلك، وليس فرز Orm في قاعدة البيانات.

في حالتك، أعطى دانيال بالفعل الحل الأفضل: نظرا لأنك تريد فقط الترتيب حسب نفس الحقل، ولكن بالترتيب الآخر، فقط عكس القائمة لديك:

qs = Foo.objects.all()[:5]
objs = reversed(qs)

إذا كنت قد أردت الفرز من قبل بعض الحقل الآخر، فأنت تستخدم الدالة الفرز () مع وظيفة مفتاح مخصص:

qs = Foo.objects.all()[:5]
objs = sorted(qs, key=lambda o: o.some_other_field)

الإجابة المتأخرة، ولكن هذا عملت للتو بالنسبة لي:

import random
sorted(queryset[:10], key=lambda x: random.random())
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top