2017-08-29 15 views
0

Ich habe diese Modelle:Django - Wie den Maximalwert nach dem deutlichen auszukommen Felder

class Product(models.Model): 
    name = CharField(max_length=128) 
    other_fields... 

class Price(models.Model): 
    product = ForeignKey(Product) 
    store = CharField(max_length=128) 
    price = DecimalField(max_digits=10, decimal_places=2) 
    date = DateField() 

die Produkte Tabelle einige Produkte enthält (...)

und der Preistabelle bekommt Update jedes Mal ein Geschäft den Produktpreis ändern.

Ich möchte den neuesten Preis ("aktueller Preis") von jedem Geschäft erhalten und dann den maximalen und den durchschnittlichen Preis jedes Produkts erhalten.

ich versuchte es zuerst für ein Produkt:

Price.objects.filter(product__id=42).order_by('store','-date').distinct('store').annotate(Max('price')) 

bekam aber:

NotImplementedError: annotate() + distinct(fields) is not implemented. 

ich auch order_by hinzuzufügen versucht, ('- Preis'), um das Maximum zu bekommen, aber es bestellt zuerst nach Datum, also ist es nutzlos.

Jeder Vorschlag, wie es ohne mehrere Abfragen und böse Schleifen zu tun?


EDIT: Um die Dinge noch klarer, hier eine Probe einer Preistabelle ist:

id |    date    | store | price | product_id 
-----+-------------------------------+-------------+-------+------------ 
107 | 2017-08-20 00:36:21+03  | shufersal | 3.510 |   51 
128 | 2017-08-20 01:57:07+03  | shufersal | 4.360 |   51 
154 | 2017-08-20 01:58:04+03  | mega  | 3.900 |   51 
157 | 2017-08-23 15:15:03+03  | mega  | 3.220 |   51 
189 | 2017-08-23 15:15:03+03  | tivtaam  | 3.480 |   51 
198 | 2017-08-23 15:40:42+03  | tivtaam  | 3.510 |   51 
219 | 2017-08-23 20:41:22+03  | ramilevi | 4.500 |   51 
244 | 2017-08-23 21:17:54+03  | ramilevi | 3.545 |   51 

Reihen 128.157.198.244 das neueste Update von jedem Geschäft sind. Ich möchte den Höchstpreis für diese Zeilen (4.360) und den Durchschnitt (3.659) erhalten.

Antwort

0

Hallo können Sie versuchen, wie diese

Price.objects.filter(product__id=42).order_by('store','-date').annotate(max_value=Max('price', distinct = True)) 

ich denke, es muss

+0

arbeiten kann ich nicht verstehen, wie das funktionieren sollte. Alles, was ich bekomme, wenn dies ausgeführt wird, sind ALLE Preise dieses Produkts mit einer Spalte "max_price", die den Preis jeder Zeile enthält. – user1557330

Verwandte Themen