假设我有一个像Bill这样的事情的查询集:
test=Things.objects.filter(user='Bill')
现在我想按照分配给账单的日期对所有这些事情进行排序。遗憾的是,分配日期不是 Thing 模型中的字段。相反,有一个名为 thing_date()的方法可以找出并返回日期。例如,以下内容:
Thingobject.thing_date()
...返回日期。我想我想做的是:
test=Things.objects.filter(user='Bill').order_by(self__thing_date())
......但我知道这不会奏效。还有另一种方式吗?
毫不奇怪,其他人之前一直在这条路上。 Link
答案 0 :(得分: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())
如果您有大量的Things
,那么您必须找到一些方法将thing_date
放入数据库,否则您将遇到内存问题。
答案 1 :(得分: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')