Django 按字段总和排序

14 投票
4 回答
8780 浏览
提问于 2025-04-16 00:42

可以用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中真的能做到吗?

4 个回答

2

使用额外的:

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

我觉得是时候给出更好的答案了。因为 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

20

你可以用 extra 来实现这个功能。

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

可以查看 官方文档,了解更多信息。

撰写回答