2012-01-04 3 views
3
def mysearch(request): 
    """This view builds a Q object query based on which fields are filled.""" 
    if 'submit' in request.POST: 
     # build Q object depending on fields submitted 
     q = Q() 
     if request.POST['first_field']: 
      q &= Q(firstfield__icontains = request.POST['first_field']) 

     ... 

     if request.POST['sixth_field']: 
      q &= Q(sixthfield__icontains = request.POST['sixth_field']) 

     results_list = MyModel.objects.filter(q) 
     count = len(results_list) 

     # store results 
     request.session['results_list'] = results_list 
     request.session['count'] = count 

    # 'p' is an arbitrary marker to detonate pagination of a page other than 1 
    if 'p' in request.GET: 
     results_list = request.session['results_list'] 
     count = request.session['count'] 

    if count and count > 0: 
     ... 
     # pagination code 
     ... 

    else: 
     pass 
    return render_to_response('search_results.html', 
     locals(), context_instance=RequestContext(request)) 

ページテンプレートを使用しているすべてのテンプレートでうまく動作します。問題は、Djangoのデバッグツールバーは、最初のページよりも> 1のページでデータベースに同じ回数だけヒットしていることを示しています。どうしてこれなの?実際には、なぜそれはデータベースに全く当たらないのですか? request.sessionからresults_list全体を取り出すべきではありませんか?どんなアドバイスも感謝しています。Django - request.sessionにクエリーセットを格納しても、依然としてdbをクエリします - なぜですか?

答えて

4

セッションにquerysetオブジェクトを保存しています。クエリセットはSQL文と似ていますが、結果をキャッシュします。セッション中にクエリを実行していないので、格納しているのは基本的にクエリだけです。それが引き出されると、まだ実行されていないクエリだけであるため、クエリーセットは再び実行されます。

request.session['count'] = len(request.session['results_list']) 

はまた心のそのセッションに保つ...

request.session['results_list'] = list(results_list) 

、あなたはあなたができるcountを見つけたとき、あなたに別のクエリを保存する:あなただけの実際の結果を保存していることを確認するために、これを行いますデータは(デフォルトでは)データベースに保存されているので、完全なデータのPythonのピクルス表現を保存することによって、自分自身に何の恩恵も与えないかもしれません。実際には元のテーブルに移動してそのようにするだけでもっと早くなるかもしれません。

+0

大きなアドバイス。ありがとう。また、セッションデータがデフォルトでdbに保存されていることに気づいていませんでした。 –

+0

セッション記憶域をmemcachedに移動することができます。これにより、サーバーに十分なRAMがある限り、データベースから負荷をシフトし、一般にパフォーマンスを向上させます。パフォーマンスのために操作上の複雑さを犠牲にしています。 – Leopd

関連する問題