[Fixed]-Django order_by sum of fields

20👍

You can use extra for this.

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

See the documentation.

15👍

I think it’s time to provide better answer. Since django team is considering deprecating extra(), it’s better to use annotate() with F() expression:

from django.db.models import F

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

see also https://code.djangoproject.com/ticket/25676

👤m51

2👍

Use extra:

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

0👍

You can use F() expression directly in order_by now, your suggested code should work:

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

Leave a comment