簡體   English   中英

如何按(字段、自定義函數、字段)對 Django QuerySet 進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM