2013-07-26 295 views
7

假設我們有如下定義Django的ORM模型MeetupDjango的ORM - 獲取最新記錄組

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

我想取每種語言的最新聚會。

這似乎可以使用Django Aggregates使這個查詢方便:

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

在我看來這應該取每種語言的「最新」聚會。但事實並非如此:

>>> 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(latest_date = Max(「date」)) [{'latest_date':datetime.date(2013,7,26),'language':u'節點'},{'latest_date':datetime.date(2013,7,26),'language':u'python'}] –