2013-07-26 9 views
7

Wyobraź mamy model Django ORM Meetup z następującą definicję:Django ORM - Pobierz najnowszą płytę dla grupy

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

chciałbym pobierze najnowszą Meetup dla każdego języka.

Wydaje się, można użyć Django Aggregates aby to wyszukiwanie proste:

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

w moim umyśle to powinno pobrania „najnowszej” Meetup dla każdego języka. Ale tak nie jest:

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

Spodziewałem się uzyskać tylko dwa najnowsze spotkania Python i Node!

Jak mogę utworzyć zapytanie, które będzie pobierać tylko najnowsze spotkania dla każdego języka?

PS. Używam MySQL jako mojego zaplecza.

+0

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

+0

@VictorCastilloTorres przykro nie było jasne. - celem jest uzyskanie wszystkich unikalnych spotkań w jednym zapytaniu. –

Odpowiedz

10

Umieść swoją klauzulę values przed annotate.

Z aggregation docs:

Jeśli wartości() klauzula poprzedza opisywanie() adnotacji będą obliczane przy użyciu grupowania opisanej przez wartości() klauzuli.

Jednak jeśli klauzula adnotate() poprzedza wartość values ​​(), adnotacje będą generowane w całym zestawie zapytań. W takim przypadku, klauzula values ​​() ogranicza tylko pola generowane na wyjściu.

Więc powinno to zrobić:

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

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

Powiązane problemy