2012-01-23 17 views
3

私はモデルを持っている他のフィールドを返すように注釈を付けます。Djangoは、同様

私がしたことはModelTest.objects.values('test_field').annotate(td=Max('test_date')).values('test_field','test_date')でした。

ここで、選択した行に対して他のすべてのフィールド値も取得します。 valuesのいずれかに追加しようとすると、注釈は機能しません。

解決策はありますか?

UPDATE:

試験データ:出力されているよう

test_name | test_field | test_date      | test_make 

test1  | 1   | 2012-01-23 15:24:10.389+05:30 | 3 

test2  | 2   | 2012-01-23 15:24:26.747+05:30 | 5 

test3  | 3   | 2012-01-23 15:27:19.033+05:30 | 1 

test4  | 2   | 2012-01-23 15:29:45.098+05:30 | 4 

test5  | 3   | 2012-01-23 15:54:01.322+05:30 | 2 

今、私がしたい:

test1  | 1   | 2012-01-23 15:24:10.389+05:30 | 3 

test4  | 2   | 2012-01-23 15:29:45.098+05:30 | 4 

test5  | 3   | 2012-01-23 15:54:01.322+05:30 | 2 

答えて

2

あなたはこのようなもの使用することができます

[ModelTest.objects.get(test_field=x['test_field'],test_date=x['td']) 
    for x in ModelTest.objects.values('test_field').annotate(td=Max('test_date')) 
] 

あなたの注釈はあなたが望むフィールドだけを返すので、あなたの結果と一致するtest_field + test_dateの組み合わせが1つだけあります。

注釈はオブジェクトを返さず、一致のリストのみが辞書であるため、オブジェクトを再度照会する必要があります。

より良いアプローチは、独自のカスタムクエリを記述し、私はあなたを理解していた場合、私は100%ではないんだけど、あなたはここにDjangoのガイドを参照している場合extra

+0

これは、**同じtest_field **のmax test_date **を与えてくれるのではないかと心配です。基本的に注釈を付けることはありません。 –

+0

こんにちはBurhan、この方法は問題ありません。しかし、単一のDjangoクエリを作成することは可能ですか? –

+0

これは、カスタムSQLを「余分」で行うことができます –

0

でそれを使用するために、次のようになります。https://docs.djangoproject.com/en/dev/topics/db/aggregation/#cheat-sheet

いくつかの条件が集計句に合致する行全体を持つ集計クエリセットを返すには、ModelTest.objects.all()。annotate(td = Max( 'test_date'))と記述します。厳密に言えば、max( 'test_date')がテーブル内で複数回出現すると、これは複数の行を与えます。

最初にクエリセットをフィルタリングする必要がある場合は、フィルタ(criteria_here)を使用できるall()を使用する代わりに、クエリセットをフィルタリングして、他のクエリセットと同様にチェーンすることができます。

+0

申し訳ありませんが、私はその結果を得ることはできません。アップデートに必要な出力を参照してください。 –