2017-09-14 1 views
1

J'ai un modèle comme celui-ci:Django ORM: groupe enregistre par un champ, puis obtenir les enregistrements avec la valeur du champ max dans chaque groupe

Class Foo(model.Models): 
    date = models.DateField() 
    price = models.FloatField() 
    volume = models.IntegerField() 

Je veux obtenir une liste de tous les objets avec le plus prix dans chaque jour! quelque chose comme ceci:

{ 
    2017-01-01: {"date": 2017-01-01, "price": 1000, "volume": 210}, 
    2017-01-02: {"date": 2017-01-02, "price": 1032, "volumne": 242}, 
    . 
    . 
    . 
} 

Puis-je le faire avec une requête? La base de données est relativement grande et effectuer une boucle sur les dates ne fonctionnera pas.

+0

Je pourrais vous montrer une requête conventionnelle assez facilement, mais vous auriez à comprendre comment faire fonctionner cela dans votre environnement django. Si c'est ce que vous voulez, voir https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very -simple-sql-query – Strawberry

Répondre

2

Vous pouvez faire quelque chose comme ça pour obtenir le prix maximum pour une date donnée

from django.db.models import Max 

Foo.objects.values('date').annotate(max_price=Max('price')) 

Edit: Si vous souhaitez obtenir tout l'objet qui a le prix maximum pour une date donnée, vous pouvez y parvenir par OuterRef et Subquery, soutenu dans Django 1,11

from django.db.models import Max, Subquery, OuterRef 

subquery = Foo.objects.filter(date=OuterRef('date')).order_by('-price') 
queryset = Foo.objects.filter(price=Subquery(subquery.values('price')[:1])) 

cela va créer une sous-requête pour obtenir l'objet avec la valeur du prix maximum pour une date donnée, puis filtrer le principal queryset par cette sous-requête. Vous pouvez en lire plus sur Subquery au Django docs.

+0

cela renvoie le prix maximum seulement. Je veux l'objet qui a le prix maximum! (Je veux aussi son volume) – Navid777

+0

ah, intéressant. mis à jour ma réponse – arjun27