2017-08-29 2 views
0

J'ai ces modèles:Django - Comment obtenir la valeur maximale après distincte sur les champs

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() 

la table produits contient des produits (...)

et le tableau des prix se mettre à jour chaque fois un magasin change le prix du produit.

Je veux recevoir le dernier prix («prix actuel») de chaque magasin, et ainsi obtenir le prix maximal et le prix moyen de chaque produit.

Je l'ai essayé d'abord pour un seul produit:

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

mais a obtenu:

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

J'ai aussi essayé d'ajouter order_by ('- prix') pour obtenir le maximum, mais il a ordonné d'abord par date, donc c'est inutile.

Une suggestion comment le faire sans plusieurs requêtes et des boucles méchantes?


EDIT: Pour rendre les choses plus claires, voici un échantillon d'une table de prix:

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 

lignes 128.157.198.244 sont la dernière mise à jour de chaque magasin. Je veux obtenir le prix maximum de ces lignes (4.360), et la moyenne (3.659).

Répondre

0

Salut pouvez-vous essayer comme ça

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

je pense qu'il doit travailler

+0

Je ne comprends pas comment cela devrait fonctionner. Tout ce que je reçois en cours d'exécution c'est TOUT prix de ce produit avec une colonne "max_price" qui contient le prix de chaque ligne. – user1557330