Django - сохранение набора запросов в request.session все еще запрашивает БД - почему? - PullRequest
3 голосов
/ 05 января 2012
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, сколько на первой странице.Почему это?На самом деле - почему он вообще попадает в базу данных?Разве все results_list не должно быть извлечено из request.session?Любой совет высоко ценится.

1 Ответ

4 голосов
/ 05 января 2012

Вы сохраняете объект queryset в сеансе. Наборы запросов похожи на операторы SQL, но они кэшируют результаты. Вы не запускали запрос, когда помещали его в сеанс, поэтому то, что вы храните, - это, по сути, просто запрос. Когда его извлекают, он все равно остается запросом, который еще не запущен, поэтому набор запросов запускается снова. Чтобы убедиться, что вы сохраняете только фактические результаты, сделайте следующее:

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

и чтобы сохранить вам другой запрос, когда вы найдете count, вы можете ...

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

Также имейте в виду, что данные сеанса (по умолчанию) сохраняются в базе данных, поэтому вы, возможно, не сделаете себе никаких одолжений, храня заполненное питоном представление полных данных. На самом деле, может быть, быстрее подойти к исходному столу и вытащить его таким образом.

...