2013-07-26 11 views
7

Stellen wir das Django ORM-Modell Meetup mit folgenden Definition haben:Django ORM - Holen Sie sich aktuellen Rekord für Gruppe

class Meetup(models.Model): 
    language = models.CharField() 
    date = models.DateField(auto_now=True) 

Ich mag würde die neuesten Clubs für jede Sprache holen.

Es scheint, Sie Django Aggregates nutzen könnten diese Lookup einfach zu machen:

Meetup.objects.annotate(latest_date=Max("date")).values("language", "latest_date") 

In meinem Kopf sollte die „neuesten“ meetup für jede Sprache holen. Aber das ist nicht der Fall:

>>> Meetup.objects.create(language='python') 
<Meetup: Meetup object> 
>>> Meetup.objects.create(language='python') 
<Meetup: Meetup object> 
>>> Meetup.objects.create(language='node') 
<Meetup: Meetup object> 
>>> Meetup.objects.create(language='node') 
<Meetup: Meetup object> 
>>> Meetup.objects.annotate(latest_date=Max("date")).values("language", "latest_date").count() 
4 

Ich erwartete, nur die zwei neuesten Python und Node Meetups zu bekommen!

Wie kann ich eine Abfrage erstellen, die nur die neuesten Meetups für jede Sprache abruft?

PS. Ich benutze MySQL als mein Backend.

+0

Meetup.objects.filter (language = "Python") order_by ('- date') [0] –

+0

@VictorCastilloTorres leid, es war nicht klar. - Ziel ist es, das einzigartige Meetup in einer einzigen Abfrage zu erhalten. –

Antwort

10

Setzen Sie Ihre values Klausel vor die annotate.

Vom aggregation docs:

Wenn die Werte() Klausel steht vor dem annotate(), wird die Anmerkung durch die Werte() Klausel beschrieben mit der Gruppierung berechnet werden.

Wenn jedoch die Annotate() - Klausel der Klausel values ​​() vorangestellt ist, werden die Annotationen über den gesamten Abfragesatz generiert. In diesem Fall beschränkt die Klausel values ​​() nur die Felder, die bei der Ausgabe generiert werden.

So sollte es tun:

Meetup.objects.values('language').annotate(latest_date=Max('date')) 
+0

>>> Meetup.objects.values ​​("Sprache"). Annotate (Spätestes_Datum = Max ("Datum")) [{'Letztes_Datum': datetime.date (2013, 7, 26), 'Sprache': u ' Knoten '}, {' letzter_Datum ': datetime.date (2013, 7, 26),' Sprache ': u'python'}] –

Verwandte Themen