Django order_by字段总和

So8*_*res 12 python django

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

例如,我有一个如下所示的模型:

class Component(models.Model):
    material_cost = CostField()
    labor_cost = CostField()
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情:

component = Component.objects.order_by(F('material_cost') + F('labor_cost'))[0]
Run Code Online (Sandbox Code Playgroud)

但不幸的是,F对象似乎不适用于'order_by'.django有可能这样吗?

Dan*_*man 18

你可以用extra它.

Component.objects.extra(
    select={'fieldsum':'material_cost + labor_cost'},
    order_by=('fieldsum',)
)
Run Code Online (Sandbox Code Playgroud)

请参阅文档.


m51*_*m51 7

我认为是时候提供更好的答案了。由于django小组正在考虑弃用extra(),因此最好annotate()F()expression 一起使用:

from django.db.models import F

Component.objects.annotate(fieldsum=F('material_cost') + F('labor_cost')).order_by('fieldsum')
Run Code Online (Sandbox Code Playgroud)

另请参阅https://code.djangoproject.com/ticket/25676