我想做一些排序,我想要的是使用名为 ordering 的参数执行 GET 请求,如下所示,该值将是我将用于排序的模型属性,如下所示:
?order=['-age', 'height']
问题是当我尝试接收订单参数时。该值是一个列表。
我尝试像这样使用 ast:
if 'order' in request.GET:
import ast
order = ast.literal_eval(request.GET.get('order'))
queryset = queryset.order_by(*order)
它成功了。但是,我想避免使用 ast 库,还有其他方法吗?
更新
我的参数是这样的:
?order=-年龄,高度
就像这样在 python 中使用 split :
if 'order' in request.GET:
order = request.GET.get('order').split(',')
queryset = queryset.order_by(*order)
最佳答案
Django 允许在请求中发送多个 GET 参数,但发送它们的方式是错误的(不仅适用于 Django)
您请求的格式应为 ?order=-age&order=height
然后在 View 中您可以执行 order_list = request.GET.getlist('order')
您无需检查键“order”是否在 GET 参数中,因为如果未找到该键,.getlist()
将返回一个空列表...
如果您只需要列表中的第一项,可以使用 request.GET.get('order')
,如果键不存在,则返回 None。
最终代码:
order_list = request.GET.getlist('order')
queryset = queryset.order_by(*order_list)
P.S 虽然 django 允许 GET 参数命名为任何名称,但 PHP(我认为其他网络语言)要求 GET 列出参数命名为 param[] (例如 order[]),因此库就像 JQuery 一样命名您的 AJAX 请求参数。
在这种情况下,您必须在 View 中使用正确的名称,即 request.GET.getlist('order[]')
关于python - Django请求GET参数值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41823399/