[英]How to sort a Django QuerySet by (field, custom function, field)
我正在尋找一個按字段 1、函數、字段 2 排序的 QuerySet。
該模型:
class Task(models.Model):
issue_id = models.CharField(max_length=20, unique=True)
title = models.CharField(max_length=100)
priority_id = models.IntegerField(blank=True, null=True)
created_date = models.DateTimeField(auto_now_add=True)
def due_date(self):
...
return ageing
我正在尋找類似的東西:
taskList = Task.objects.all().order_by('priority_id', ***duedate***, 'title')
顯然,您不能通過自定義函數對查詢集進行排序。 有什么建議嗎?
由於實際排序發生在不使用 Python 的數據庫中,因此您不能使用 Python 函數進行排序。 您需要在 SQL 表達式中實現截止日期邏輯,作為Queryset.extra(select={...})
計算字段,類似於:
due_date_expr = '(implementation of your logic in SQL)'
taskList = Task.objects.all().extra(select={'due_date': due_date_expr}).order_by('priority_id', 'due_date', 'title')
如果您的邏輯過於復雜,您可能需要將其實現為數據庫中的存儲過程。
或者,如果您的數據集非常小(例如,幾十到幾百條記錄),您可以在列表中獲取整個結果集並在事后對其進行排序:
taskList = list(Task.objects.all())
taskList.sort(cmp=comparison_function) // or .sort(key=key_function)
@lanzz 的答案,盡管看起來是正確的,但對我不起作用,但是來自另一個線程的這個答案對我來說很神奇:
https://stackoverflow.com/a/37648265/6420686
from django.db.models import Case, When
ids = [list of ids]
preserved = Case(*[When(id=pk, then=pos) for pos, pk in enumerate(ids)])
filtered_users = User.objects \
.filter(id__in=ids) \
.order_by(preserved)
如果查詢集不是太大,您可以在 Python 中使用排序:
ordered = sorted(Task.objects.all(), key=lambda o: (o.priority_id, o.due_date(), o.title))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.