<p>原始代码示例中的一个问题是RawQuerySets不适用于get_context_data中显示的分页代码,这些代码应该是带有过滤器的模型对象,否则分页代码将失败。例如</p>
<pre><code> mydata = self.model.objects.filter(material_type__icontains = 'book')
</code></pre>
<p>然而,在这种情况下,RawQuerySets是必需的,并且很有用,因为附加的(未显示)查询具有复杂的内部连接等,使用过滤器很难完成。在</p>
<p><a href="https://grokbase.com/t/gg/django-users/133tcq99zb/casting-a-raw-query-set-as-a-list-for-pagination" rel="nofollow noreferrer">One solution for casting a raw query set as a list for pagination
is answered in:</a></p>
<p>另外,RawQuerySet的django paginator模块也可以用来帮助解决这篇文章中链接的问题。在</p>
<p><a href="https://github.com/mblance/django-paginator-rawqueryset" rel="nofollow noreferrer">django-paginator-rawqueryset</a></p>
<p>在模块的帮助下,原始查询集可以有效地与给定的分页器代码一起使用,以利用上下文对象返回要传递给模板的上下文。然后,模板和显示页面导航的典型代码一起,还能够利用附加到上下文的变量来根据需要显示数据。在</p>
^{pr2}$
<p>显示的问题示例,来自视图.py,有点“暴力”,可以在类内定义的帮助下进行更紧凑的编码,如第一个答案所示。这里显示了使用另一个模块解决问题的方法:</p>
<pre><code> 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
</code></pre>