【问题标题】:Ordering a Django queryset by the returned results of a method通过方法的返回结果对 Django 查询集进行排序
【发布时间】:2011-10-19 09:43:34
【问题描述】:

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

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    如果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 输入数据库,否则您将遇到内存问题。

    【讨论】:

    • 嗯,这可以让事情按正确的顺序排列,但它会进一步分解一些为使用查询集而编写的代码。但这是一个单独的问题。感谢您的回答。
    【解决方案2】:

    查看这些答案以使用计算值对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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 2016-10-16
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多