Frage Produkt aus Annotation mit zwei Feldern


Ich habe derzeit eine Zeile in meiner Django App wie folgt:

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

Ich würde dies lieber über die Modelloberfläche machen, die mein Django zur Verfügung stellt, kann aber keine Referenzen finden.

Ich bin mir ziemlich sicher, dass dies mit einer Anmerkung gemacht werden kann, aber die Beispiele decken nur einige von ihnen ab und ich kann keine Liste in der Dokumentation finden.

Ich würde gerne so etwas machen:

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

Kann jemand vorschlagen, eine Annotation-Klasse zu verwenden, um die Multiplikation durchzuführen? Noch besser, eine Verbindung zur API, die all diese Annotation / Aggregation-Klassen auflistet?


5
2018-05-11 09:50


Ursprung


Antworten:


Leider da sind nicht genug integrierte Aggregatfunktionen und speziell gibt es keine für Produkt.

Aber das beschränkt Sie in keiner Weise, außer dass Sie eine "unpräzise" ORM-Abfrage schreiben müssen. Speziell für Ihren Fall sollten Sie Folgendes tun können:

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

1
2018-05-11 11:10



Es ist nicht eindeutig dokumentiert, aber dies kann mit der F() Funktion:

from django.db.models import F

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

0
2018-02-02 21:31