Django 请求 GET 参数值列表

Dea*_*ada 2 python django

我想做一些排序,我想到的是使用名为 ordering 的参数执行 GET 请求,该值将是我将用于排序的模型属性:

?order=['-age', 'height']
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试接收订单参数时。值是一个列表。

我尝试像这样使用 ast:

if 'order' in request.GET:
        import ast
        order = ast.literal_eval(request.GET.get('order'))
        queryset = queryset.order_by(*order)
Run Code Online (Sandbox Code Playgroud)

有效。但是,我想避免使用 ast 库,还有其他方法吗?

更新

我这样做了我的参数:

?order=-age,height

并且像这样在 python 中使用 split :

if 'order' in request.GET:
    order = request.GET.get('order').split(',')
    queryset = queryset.order_by(*order)
Run Code Online (Sandbox Code Playgroud)

Res*_*ues 12

Django 允许在一个请求中发送多个 GET 参数,但是你发送它们的方式是错误的(不仅对于 Django)
你的请求应该是表单?order=-age&order=height
然后在视图中你可以做order_list = request.GET.getlist('order')

您不需要检查键“order”是否在 GET 参数中,因为.getlist()如果找不到键,则返回一个空列表...

如果您只想要列表中的第一项,则可以使用request.GET.get('order')which 在键不存在时返回 None 。

最终代码:

order_list = request.GET.getlist('order')
queryset = queryset.order_by(*order_list)
Run Code Online (Sandbox Code Playgroud)

PS虽然 django 允许将 GET 参数命名为任何名称,但 PHP(以及我认为其他网络语言)需要将 GET 列表参数命名为 param[](示例 order[]),因此像 JQuery 这样的库将您的 AJAX 请求参数命名为这样。在这种情况下,您必须在视图中使用正确的名称,即request.GET.getlist('order[]')