Django django-filter django-tables2 限制查询结果
Django django-filter django-tables2 limit query results
我正在尝试限制使用 django-filter 过滤并由 django-tables2 构建的 table 中显示的行数。我在这里或文档中没有找到任何内容(我不想使用分页)。
我知道我可以对查询集进行切片,但我也想拥有 table sortable,但不知道如何做到这两个。
这是我的 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,
})
我试图在将查询集传递给 table 之前对其进行切片:
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 或操作查询集来限制显示的行数?
更新:
我按照建议尝试了,但不适用于我的数据库:
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 的查询集。
# get the 20 ids for the objects you want
f_qs_ids = f.qs.order_by(request.GET.get('sort')).values_list("id", flat=True)[:20]
# create a new queryset by also filtering on the set of 20 ids
f_qs = f.qs.filter(id__in=f_qs_ids)
# pass a legitimate queryset to the table
table = PassTable(f_qs)
我正在尝试限制使用 django-filter 过滤并由 django-tables2 构建的 table 中显示的行数。我在这里或文档中没有找到任何内容(我不想使用分页)。 我知道我可以对查询集进行切片,但我也想拥有 table sortable,但不知道如何做到这两个。
这是我的 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,
})
我试图在将查询集传递给 table 之前对其进行切片:
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 或操作查询集来限制显示的行数?
更新: 我按照建议尝试了,但不适用于我的数据库:
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 的查询集。
# get the 20 ids for the objects you want
f_qs_ids = f.qs.order_by(request.GET.get('sort')).values_list("id", flat=True)[:20]
# create a new queryset by also filtering on the set of 20 ids
f_qs = f.qs.filter(id__in=f_qs_ids)
# pass a legitimate queryset to the table
table = PassTable(f_qs)