2013-07-26 5 views
7

Представьте, что мы имеем модель Django ORM Meetup со следующим определением:Django ORM - получить последнюю запись для группы

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

я хотел бы принести последнюю Meetup для каждого языка.

Казалось бы, вы могли бы использовать Django Aggregates, чтобы сделать этот поиск легко:

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

На мой взгляд, это должно принести «последнюю» Meetup для каждого языка. Но это не тот случай:

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

Я ожидал получить только две последние встречи на Python и Node!

Как я могу построить запрос, который будет получать только последние встречи для каждого языка?

PS. Я использую MySQL как бэкэнд.

+0

Meetup.objects.filter (язык = "питон") order_by ('- дата') [0] –

+0

@VictorCastilloTorres жаль, что не было ясно. - цель состоит в том, чтобы получить всю уникальную встречу в одном запросе. –

ответ

10

Поместите свой пункт values до annotate.

От aggregation docs:

Если значение() пункт предшествует Аннотировать(), аннотация будет вычислена с использованием описанной группировки по значениям() пункт.

Однако, если предложение annotate() предшествует предложению values ​​(), аннотации будут генерироваться по всему набору запросов. В этом случае предложение values ​​() ограничивает только поля, генерируемые на выходе.

Так что это следует сделать это:

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

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

Смежные вопросы