2011-05-11 8 views
5

Actualmente tengo una línea en mi Django aplicación como esta:Producto de dos campos de anotación

db.execute("SELECT SUM(price * qty) FROM inventory_orderline WHERE order_id = %s", [self.id]) 

prefiero realizo esto a través de la interfaz de modelos proporcionado mi Django, pero no puedo encontrar ninguna referencia.

Estoy bastante seguro de que esto se puede hacer con una anotación, pero los ejemplos solo cubren algunos de ellos y no puedo encontrar una lista en la documentación.

me gustaría hacer algo como esto:

self.line_items.annotate(lineprice=Product('orderline__price', 'orderline__qty')).aggregate(Sum('lineprice')) 

¿Puede alguien sugerir una clase de anotación a utilizar para realizar la multiplicación? Mejor aún, ¿un enlace a la API que enumera todas estas clases de anotación/agregación?

Respuesta

1

Lamentablemente, hay aren't enough funciones integradas de agregado y, específicamente, no hay ninguna para Producto.

Pero eso no lo limita de ninguna otra manera que tener que escribir una consulta ORM "no concisa". Específicamente para su caso, usted debería ser capaz de hacer:

self.line_items.extra(select=("lineprice": "orderline__price*orderline__qty")).aggregate(Sum('lineprice')) 
+0

Gracias, primera vez que he visto que la técnica . – Cogsy

+0

Puedo hacer que esto funcione, pero tengo que usar SUM (price * qty) ya que no sigue las relaciones double'_ ', y el agregado no puede ver el campo' lineprice '. Todavía menos que deseable me temo – Cogsy

+11

Esto no funcionará. El 'aggregate' no puede ver las cosas introducidas por' extra' (también el 'select' espera un diccionario, por lo que necesitaría' {} 'en vez de'() ') – greg

0

No es claramente documentados, pero esto se puede hacer con la función F():

from django.db.models import F 

self.line_items.annotate(lineprice=F('orderline__price') * F('orderline__qty')).aggregate(Sum('lineprice')) 
Cuestiones relacionadas