Django несколько наборов запросов, разбитых на страницы как один - PullRequest
3 голосов
/ 18 ноября 2011

Привет! Я создаю страницу результатов поиска, которая объединяет несколько наборов запросов из нескольких баз данных, которые я хотел бы разбить на страницы как один набор.

, на мой взгляд, у меня есть:

def combined_search(request):
    ...
    first_query_set = Mytable_db1.objects.select_related().filter(q)
    first_count = first_query_set.count

    second_query_set = Mytable_db2.objects.select_related().filter(q)
    second_count = second_query_set.count
    # combine querysets
    combined_query_set = list(chain(first_query_set, second_query_set))

    # create a new paginator instance with items-per-page
    paginator = Paginator(combined_query_set, 5)
    # get the page number from a get param if param is blank then set page to 1 
    page = int(request.GET.get('page', '1')) 
    # grab the current page from the paginator...  
    items = paginator.page(page)
    ...

Затем в моем шаблоне я хочу что-то вроде:

<h1>{{ first_count }} results in mydb1:</h1>
{% for x in first_query_set %}
     <p>{{ x.field }}</p>
{% endfor %}


<h1>{{ second_count }} results in mydb2:</h1>
{% for y in second_query_set %}
     <p>{{ y.field }}</p>
{% endfor %}

Проблема в том, что я хочу разбить на страницы оба набора, как если бы они были одним, но включая заголовки.Поэтому, если для первого набора есть только 2 результата, а для второго - 18, первый набор (включая заголовок) просто появится на первой странице, и у меня есть еще 3 страницы для второго набора.

1 Ответ

2 голосов
/ 18 ноября 2011

Вы хотите разбить наборы запросов на страницы по отдельности, но затем отобразить номер страницы из запроса на соответствующий нумератор страниц.

Примерно так:

page = int(request.GET.get('page', '1'))
first_set_page_count = math.ceil(first_count / 5)
if page > first_set_page_count:
    page = page - first_set_page_count
    items = second_paginator.page(page)
else:
    items = first_paginator.page(page)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...