繁体   English   中英

Django django-filter django-tables2 限制查询结果

[英]Django django-filter django-tables2 limit query results

我试图限制使用 django-filter 过滤并由 django-tables2 构建的表中显示的行数。 我在这里或文档中没有找到任何东西(我不想使用分页)。 我知道我可以对查询集进行切片,但我也希望表可排序,但不知道如何做到这两点。

这是我的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 = 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 重新过滤原始 QuerySet。

# 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM