2009-07-13 9 views
0

私のクライアントの1人は、Django管理者からクライアントリストを生成しています。現在の状態、取得した状態、過去の状態でクライアントを分割します。DjangoとSQLの質問:データベースのヒット数を減らす

次のように現在、そのリストのビューのコードは次のとおりです。それは私が行う方法がありますかなり確信して3回データベースを打つよう

def clients_list(request): 
current_clients = Client.objects.all().filter(status='current')[:10] 
acquired_clients = Client.objects.all().filter(status='acquired')[:10] 
past_clients = Client.objects.all().filter(status='past')[:10] 

return render_to_response('clients/list.html', { 
    'current_clients': current_clients, 
    'acquired_clients': acquired_clients, 
    'past_clients': past_clients 
}) 

は今、私は、これは理想的ではありません知っています1つのクエリだけです。このコードをリファクタリングしてデータベースに一度しかヒットせず、Pythonを使用して3つの変数に結果を分割することは可能ですか?それとも、私のアプリケーションの些細な部分に重すぎることを強調していますか? 「あまりにも多くのストレス」:あなたのアプリをプロファイリングし、これは深刻なボトルネックになって知ってきた場合を除き

おかげで、

マット

+1

遅いですか?そうでない場合は、1つ進み、他の場所で最適化します。 – ebo

答えて

2

は、私はあなたが答えを持っていると思います。

あなたQ objectsを使用して、単一のORM文でデータをフェッチすることができ...

clients = Client.objects.filter(Q(status='current')|Q(status='acquired')|Q(status='past'))[:30] 

...しかし、あなたは1つのクエリセット内のすべての3つの状態を持っているだろうし、おそらく持っていませんあなたのテンプレートのためにそれらを分けなければなりません。

+0

+1元のクエリで設定されている限界のため、私は「多くのことを強調する」が正解であると思います。 –

+0

ありがとう(私はそれを投票するだろうが、私は十分な担当者を持っていない)。それは小さなサイトなので、大きなボトルネックになるとは思わない。 – mjaz