【问题标题】:Django order_by sum of fieldsDjango order_by 字段总和
【发布时间】:2011-03-10 19:14:38
【问题描述】:

是否可以使用 django ORM 通过两个不同字段的总和对查询集进行排序?

例如,我有一个看起来像这样的模型:

class Component(models.Model):
    material_cost = CostField()
    labor_cost = CostField()

我想做这样的事情:

component = Component.objects.order_by(F('material_cost') + F('labor_cost'))[0]

但不幸的是,F 对象似乎不适用于“order_by”。 django 可以做到这一点吗?

【问题讨论】:

  • 不是我想要的。该方法对所有相关对象的某个字段求和。 (在那个特定的例子中,它对所有相关投票的值求和。)我需要对原始对象的两个字段求和。因此,我不能使用 Sum 聚合器,除非有一种我不知道的使用方法。

标签: python django


【解决方案1】:

我认为是时候提供更好的答案了。由于 django 团队正在考虑弃用 extra(),因此最好使用 annotate()F() 表达式:

from django.db.models import F

Component.objects.annotate(fieldsum=F('material_cost') + F('labor_cost')).order_by('fieldsum')

另见https://code.djangoproject.com/ticket/25676

【讨论】:

    【解决方案2】:

    您可以为此使用extra

    Component.objects.extra(
        select={'fieldsum':'material_cost + labor_cost'},
        order_by=('fieldsum',)
    )
    

    the documentation

    【讨论】:

    • 这对我不起作用,但 Component.objects.extra(select={'fieldsum':'material_cost + labor_cost'}).order_by=('fieldsum') 可以。
    • 这些天你真的应该使用annotate:Component.objects.annotate(fieldsum=F('material_cost') + F('labor_cost')).order_by('fieldsum')
    【解决方案3】:

    使用额外的:

    Component.objects.extra(select = {'total_cost' : 'material_cost + labor_cost'},
                                       order_by = ['total_cost',])[0]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-14
      • 2014-06-20
      • 2017-11-24
      • 2017-06-09
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多