2016-09-13 2 views
0

データベースからの値のリストについて最新の結果を得たいと思います。Django:dbから最新の値を得る方法

例:

Task 
col1 col2 
1 1 
2 12 
3 32 
4 1 
5 24 
1 25 
2 62 
3 7 
2 81 
1 9  -> last occurence for '1' in 'col1' 
4 10  -> last occurence for '4' in 'col1' 
3 121 
5 12  -> last occurence for '5' in 'col1' 

あり、リスト「Z」はだと私はテーブルzはCOL1に存在するように「タスク」から最新の結果を得るような方法を照会書きたいです。 'Z' をされたと仮定すると:

z = [1, 4, 5] 

私は最終的な結果を望むよう:

col1 col2 
1 9 
4 10 
5 12 

私が思いついた2つのソリューションがあります。

results = dict() 
for x in z: 
    results[x] = Task.objects.filter(col1=x).reverse()[0] 

を一緒に、このような私が唯一のデータベース呼び出しを作るために持っていることと、両方のソリューションを統合する方法があるなら、私は思ったんだけど、次のように

all_results = Task.objects.filter(col1__in=z) 
results = dict() 
for result in results: 
    results[result.col1] = result 

対処方法2は次のように ソリューション1でありますそれぞれ異なる 'col1'の結果を取得します。 理由:私のデータベースは非常に大きく、現在はSolution2を実装しており、プロセス全体が非常に遅くなっています。ソリューション1は複数のエントリがあり、結果の辞書が非常に大きくなるため実行できません。そのため、非常に時間がかかるでしょう。

+0

あなたは実行速度とスペースが気になるようです。私はこれが一つの方法かもしれないと思います:もし 'Task'テーブル更新の頻度を知っていれば最後の' n'行を取り出して( 'z'のものをフィルタリングするのではなく)取り出し、もしあればそれらの行を検索します「z」で。 'z'のすべての要素を見つけることができれば、あなたは良いことです。見つからない場合は、nをnに増やして、他のn行を取り出すことができます。スペースと時間を節約します。しかし、ここでの捉え方は、 'z'の項目の出現が頻繁に起こることです。 – stuartnox

+0

@stuartnoxテーブルのサイズは数千万ではないにしても数千である。また、テーブルが頻繁に更新されるため、 'n'に割り当てる必要がある値は大きな議論になります。また、上記の例では、zは[6,7]のような値を保持することができ、[6,7]がテーブルに存在しないことがわかります。したがって、私が最後に達するまで、私は 'n'を更新し続けます。 –

+0

列を注文するための別のキーがない場合(たとえば、で更新)、テーブルの順序が保証されているとは思いません。 http://stackoverflow.com/questions/20050341/when-no-order-by-is-specified-what-order-does-a-query-choose-for-your-record – Alexander

答えて

0

この結果は、クエリセット内で達成できます。あなたのORMクエリは次のようになります:

Task.objects.filter(col1__in=z).values('col1').annotate(latest_record=Max('col2')) 
# where z = [1, 4, 5] 
+0

結果は値に依存しない'col2'。私は自分の質問を編集しました。あなたの答えに感謝します。私はエミュレートしようとし、私は最終的な意図された答えを考え出すことができるかどうかを確認します。 –

関連する問題