2013-07-26 2 views
7
の最新のレコードを取得

は、我々は次のように定義されたDjangoのORMモデルMeetupを持っている想像してみてください。DjangoのORMは、グループ

あなたがこの検索が簡単にするために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 

私はちょうど2回の最新のPythonとノードの交流会を取得するために期待しました!

各言語の最新の会合のみを取得するクエリを作成するにはどうすればよいですか?

PS。バックエンドとしてMySQLを使用しています。

+0

Meetup.objects.filter(言語= "パイソン")ORDER_BY( ' - 日')それは明確ではなかった[0] –

+0

@VictorCastilloTorres申し訳ありません。 - 目標は、すべてのユニークなミートアップを単一のクエリで取得することです。 –

答えて

10

annotateの前にvalues句を置きます。 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'}] –

関連する問題