2010-07-01 80 views
10

¿Es posible utilizar el django ORM para ordenar un queryset por la suma de dos campos diferentes?Django order_by suma de campos

Por ejemplo, tengo un modelo que se parece a esto:

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

y quiero hacer algo como esto:

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

Pero, por desgracia, no parecen objetos F de trabajar con 'order_by'. ¿Es esto posible con django?

+0

http://stackoverflow.com/questions/476017/django-queryset-order-by-method/476033#476033 –

+0

No es exactamente lo que estaba buscando. Ese método suma un cierto campo en todos los objetos relacionados. (En ese ejemplo particular, suma el valor de todos los votos relacionados.) Necesito sumar dos campos en el objeto original. Por lo tanto, no puedo usar el agregador de suma, a menos que haya una forma de usarlo de la que no tengo conocimiento. – So8res

Respuesta

17

Puede usar extra para esto.

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

Ver the documentation.

2

Uso adicional:

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