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

时间:2011-08-03 19:13:47

标签: django django-queryset

假设我有一个像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

2 个答案:

答案 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')