通过返回的方法结果对Django查询集进行排序

Jam*_*s M 13 django django-queryset

假设我有一个像Bill这样的事情的查询集:

test=Things.objects.filter(user='Bill')
Run Code Online (Sandbox Code Playgroud)

现在我想按照分配给账单的日期对所有这些事情进行排序.不幸的是,赋值日期不是Thing模型中的字段.相反,有一个名为thing_date()的方法可以计算出来并返回日期.例如,以下内容:

Thingobject.thing_date()
Run Code Online (Sandbox Code Playgroud)

...返回日期.我想我想做的是:

test=Things.objects.filter(user='Bill').order_by(self__thing_date())
Run Code Online (Sandbox Code Playgroud)

......但我知道那是行不通的.还有另外一种方法吗?

更新

毫不奇怪,其他人以前一直沿着这条路走下去.链接

Leo*_*opd 21

如果thing_date()是python代码中的函数,则无法让数据库对其进行排序.这意味着放置查询集没有意义.在将结果导入python之后,您必须对结果进行排序.只要你没有处理大量的物体,这就没问题了.

qs = Things.objects.filter(user='Bill')
unsorted_results = qs.all()
sorted_results = sorted(unsorted_results, key= lambda t: t.thing_date())
Run Code Online (Sandbox Code Playgroud)

如果你有非常多的Things那么你将不得不想办法thing_date进入数据库,否则你将有内存问题.


Mar*_*ski 10

看到这些答案使用计算值来排序QuerySet:

基本上,如果thing_date()可以使用查询表达式确定,则可以使用它来注释和搜索查询集.

from django.db.models import F
from django.utils import timezone
test = Things.objects.filter(user='Bill').annotate(
    thing_date=(F('<date field>') - timezone.now())  # some computation
).order_by('thing_date')
Run Code Online (Sandbox Code Playgroud)