Django Djangofilter Djangotables2限制查询结果

2024-04-29 10:29:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图限制使用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))

我认为这将对数据库进行两次查询,但这对我来说不是问题

谢谢你的回答,并为我指出了正确的方向。非常感谢


Tags: djangoingetbyrequesttableorderfilter
1条回答
网友
1楼 · 发布于 2024-04-29 10:29:58

这是一种迂回的方法,但是您可以使用原始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)

相关问题 更多 >