في جانغو, كيف يمكنني فرز نموذج على حقل ومن ثم الحصول على آخر البند ؟
-
05-07-2019 - |
سؤال
على وجه التحديد, لقد نموذج يحتوي على حقل مثل هذا
pub_date = models.DateField("date published")
كنت تريد أن تكون قادرة على بسهولة انتزاع الكائن مع أحدث pub_date
.ما هي أسهل/أفضل طريقة للقيام بذلك ؟
سيكون شيئا مثل التالية أفعل ما أريد ؟
Edition.objects.order_by('pub_date')[:-1]
المحلول
obj = Edition.objects.latest('pub_date')
يمكنك أيضا تبسيط الأمور من خلال وضع get_latest_by
في نموذج ميتا, ثم عليك أن تكون قادرة على القيام
obj = Edition.objects.latest()
انظر مستندات للحصول على مزيد من المعلومات.وربما كنت سوف تحتاج أيضا إلى تعيين ordering
الخيار الفوقية.
نصائح أخرى
والجواب هارلي هو الطريق للذهاب لهذه القضية حيث تريد آخر وفقا لبعض المعايير ترتيب لنماذج معينة، كما تفعل، ولكن الحل العام هو عكس ترتيب واسترداد البند الأول:
Edition.objects.order_by('-pub_date')[0]
ملاحظة:
عادي الثعبان قوائم قبول المؤشرات السلبية التي تدل على إزاحة من نهاية القائمة بدلا من بداية مثل عدد موجب.ومع ذلك ، QuerySet الكائنات رفع
AssertionError: Negative indexing is not supported.إذا كنت تستخدم مؤشر سلبي, وهذا هو السبب عليك أن تفعل ما insin قال:عكس ترتيب والاستيلاء على
0th
العنصر.
كن حذرا من استخدام
Edition.objects.order_by('-pub_date')[0]
وكما كنت قد فهرسة لمجموعة طلبات البحث فارغة. لست متأكدا ما هو النهج الصحيح Pythonic، ولكن أبسط يكون لاتمامه في إذا / آخر أو محاولة / صيد:
try:
last = Edition.objects.order_by('-pub_date')[0]
except IndexError:
# Didn't find anything...
ولكن، كما قالHarley، عندما كنت أمر من التاريخ، latest()
هو السبيل <م> djangonic م> للقيام بذلك.
لقد تم الإجابة على هذا، ولكن لمزيد من المرجعية، وهذا هو ما جانغو كتاب و> لديه ليقوله عن البيانات التقطيع على مجموعات طلبات البحث:
<اقتباس فقرة>لاحظ أن لا يتم اعتماد تشريح السلبي:
>>> Publisher.objects.order_by('name')[-1]
Traceback (most recent call last):
...
AssertionError: Negative indexing is not supported.
وهذا من السهل للالتفاف، وبالرغم من ذلك. مجرد تغيير order_by () بيان من هذا القبيل:
>>> Publisher.objects.order_by('-name')[0]
اقتباس فقرة>
وإحالة الوصلة للمزيد من مثل هذه التفاصيل. نأمل أن يساعد!