Как вы разбиваете результаты динамического поиска в Django? - PullRequest
0 голосов
/ 11 марта 2010

В настоящее время я создаю простой метод поиска для некоторых проектов. Запрос ищет как имя автора, так и текст дизайна. Проблема: что происходит, когда база данных имеет 300 000 дизайнов, и я хочу разбить результаты на страницы? Если я передаю переменную page, то каждый раз, когда пользователь переключается на другую страницу, запрос выполняется снова.

Как лучше всего решить эту проблему? Правильно ли кэшируется как можно больше запросов? Сохраняется ли определенная сумма в данных сеанса?

"""
Searches by screenname or design text
"""
def search_designs(request):

    designs = None
    words   = None

    if request.method == 'POST':
        q     = request.POST['search']
        words = q.split()

        # Get all approved designs
        designs = Design.objects.filter(status=2)

        for w in words:
            designs = designs.filter(name__icontains=w) | designs.filter(author__profile__screenname__icontains=w)

    vars = RequestContext(request, 
    {
        'results' : designs,
        'words'   : words,
    })
    return render_to_response("search_test.html", vars)

Ответы [ 2 ]

2 голосов
/ 11 марта 2010

Я бы проверил Джанго-пагинация . Он будет обрабатывать нумерацию страниц на уровне шаблона. Это действительно легко интегрировать.

1 голос
/ 11 марта 2010

Итак, вы пытаетесь сохранить все результаты, чтобы, когда пользователь перемещается по страницам, к базе данных снова нет доступа, верно? Поскольку это динамический поиск, единственный способ сделать это - кэшировать эти страницы, но страницы, которые еще не были посещены, не будут кэшироваться. Таким образом, единственным преимуществом является то, что пользователь возвращается на предыдущие страницы. Я не думаю, что вы получите много пользы от этой практики.

Совершенно нормально выполнять один запрос каждый раз, когда пользователь загружает страницу.

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

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