2013-07-26 13 views
7

Immaginiamo di avere il modello di Django ORM Meetup con la seguente definizione:Django ORM - Get ultimo disco per il gruppo

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

mi piacerebbe andare a prendere l'ultimo meetup per ogni lingua.

Sembrerebbe si potrebbe usare Django Aggregates per rendere questa ricerca facile:

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

Nella mia mente questo dovrebbe prendere il meetup "ultimo" per ogni lingua. Ma non è questo il caso:

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

Mi aspettavo di ottenere solo gli ultimi due incontri Python e Node!

Come posso creare una query che recupera solo i meetup più recenti per ogni lingua?

PS. Sto usando MySQL come mio backend.

+0

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

+0

@VictorCastilloTorres dispiace che non era chiaro. - l'obiettivo è ottenere tutto il meetup univoco in una singola query. –

risposta

10

Inserire la clausola values prima dello annotate.

Dal aggregation docs:

Se i valori() clausola precede l'annotate(), l'annotazione saranno calcolati usando il raggruppamento descritto dai valori() clausola.

Tuttavia, se la clausola annotate() precede la clausola values ​​(), le annotazioni verranno generate sull'intero set di query. In questo caso, la clausola values ​​() limita solo i campi generati sull'output.

Quindi questo dovrebbe farlo:

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

>>> Meetup.objects.values ​​("lingua"). Annotate (latest_date = Max ("date")) [{'latest_date': datetime.date (2013, 7, 26), 'language': u ' nodo '}, {' latest_date ': datetime.date (2013, 7, 26),' lingua ': u'python'}] –

Problemi correlati