我试图限制使用django过滤器过滤并由django-tables2生成的表中显示的行数。我在这里或文档中没有找到任何内容(我不想使用分页)。 我知道我可以对查询集进行切片,但我也想对表进行排序,但我不知道如何同时执行这两个操作
这是my views.py:
def filtered_table(request):
f = itemFilter(request.GET, queryset=ItemModel.objects.all())
has_filter = any(field in request.GET for field in set(f.get_fields()))
table = None
if has_filter:
if not request.GET.get('sort'):
table = ItemTable(f.qs, order_by='-timestamp')
else:
table = ItemTable(f.qs, order_by=request.GET.get('sort'))
return render(request, 'itemlist/filteredlist.html', {
'itemtable': table,
'filter': f,
})
在将queryset传递到表之前,我尝试对其进行切片:
table = ItemTable(f.qs.order_by('-timestamp')[:20])
table = ItemTable(f.qs.order_by(request.GET.get('sort'))[:20])
导致:
AssertionError: Cannot reorder a query once a slice has been taken.
因为django-tables2再次调用了.order_by()。 有没有办法配置django-tables2或操纵queryset来限制显示的行
更新: 我按建议进行了尝试,但与我的数据库不兼容:
This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
稍微改变一下,这对我来说很有用:
f_qs = ItemModel.objects.filter(id__in=list(f_qs_ids))
我认为这将对数据库进行两次查询,但这对我来说不是问题
谢谢你的回答,并为我指出了正确的方向。非常感谢
这是一种迂回的方法,但是您可以使用原始QuerySet(f.qs),然后从obj id中获取一部分,然后用这些id重新过滤原始QuerySet
相关问题 更多 >
编程相关推荐