Одной из проблем в исходном примере кода является то, что наборы RawQuerySets не работают для кода разбиения на страницы, показанного в get_context_data, и это должны быть объекты модели с фильтрами, иначе код разбиения на страницы потерпит неудачу. Ex.
mydata = self.model.objects.filter(material_type__icontains = 'book')
В этом случае, однако, наборы RawQuerySets необходимы и полезны из-за дополнительных (не показаны) запросов со сложными внутренними объединениями и т. Д., Которые сложно выполнить с помощью фильтров.
Одно решение для приведения необработанного запроса в виде списка для разбиения на страницы
ответили:
Также доступен модуль django paginator для RawQuerySet, чтобы помочь с этой проблемой, указанной в этом посте.
Джанго-Paginator-rawqueryset
С помощью модуля необработанные наборы запросов могут эффективно использоваться с заданным кодом разбиения на страницы, чтобы использовать объекты контекста для возврата контекста, который будет передан в шаблон. Затем шаблон вместе с типичным кодом для отображения навигации по страницам также может использовать переменные, связанные с контекстом, для отображения данных по мере необходимости.
{% if book_qs %}
{% endif %}
{% if image_qs %}
{% endif %}
Показанный пример проблемы из views.py является немного "грубой силой" и может быть закодирован более компактно с помощью определений в классе, как показано в первом ответе. Другое решение проблемы с использованием модуля показано здесь:
from rawpaginator.paginator import Paginator
from django.core.paginator import EmptyPage
from django.core.paginator import PageNotAnInteger
class SearchResultsAdvancedView(django.views.generic.ListView):
template_name = 'ephemera/searchresults_advanced.html'
form = AdvSearchForm()
paginate_by = 10
model = Item
def get_context_data(self, **kwargs):
context = super(SearchResultsAdvancedView, self).get_context_data(**kwargs)
choose_collection = self.request.GET.get('choose_collection')
user_input = self.request.GET.get('user_input')
choose_item = self.request.GET.get('choose_item')
bookpage = False
imagepage = False
if choose_collection == 'All' and user_input == '' and choose_item == 'book':
mydata = Item.objects.raw('SELECT * FROM ephemera_item WHERE ephemera_item.material_type LIKE %s', ['book']);
bookpage = True
elif choose_collection == 'All' and user_input == '' and choose_item == 'image':
mydata = Item.objects.raw('SELECT * FROM ephemera_item WHERE ephemera_item.material_type LIKE %s', ['image']);
imagepage = True
paginator = Paginator(mydata, self.paginate_by)
page = self.request.GET.get('page')
if bookpage:
try:
book_qs = paginator.page(page)
except PageNotAnInteger:
book_qs = paginator.page(1)
except EmptyPage:
book_qs = paginator.page(paginator.num_pages)
context['book_qs'] = book_qs
elif imagepage:
try:
image_qs = paginator.page(page)
except PageNotAnInteger:
image_qs = paginator.page(1)
except EmptyPage:
image_qs = paginator.page(paginator.num_pages)
context['image_qs'] = image_qs
return context