首页 > 解决方案 > 如何使用 django 的 OR 和 AND 运算符创建正确的过滤器字符串?

问题描述

我的应用在 vue.js 上有一个前端,在 django rest 框架上有一个后端。我需要在 vue 上做一个过滤字符串,它应该做这样的事情:

((status=closed) | (status=canceled)) & (priority=middle)

但得到一个错误作为响应

[“无效的查询字符串运算符。匹配:') & '。”]

编码后我的字符串如下所示:

?filters=((status%3D%D0%97%D0%B0%D0%BA%D1%80%D1%8B%D1%82)%20%7C%20(status%3D%D0%9E%D1%82%D0%BA%D0%BB%D0%BE%D0%BD%D0%B5%D0%BD))%20%26%20(priority%3D%D0%A1%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D0%B9)

对应于

?filters=((status=closed)|(status=canceled))&(priority=middle)

应该如何为 django 寻找正确的过滤器字符串?

|如果语句包含 only或 only ,我没有问题&。例如,像这样的过滤器字符串非常完美:

?filters=(status%3D%D0%97%D0%B0%D0%BA%D1%80%D1%8B%D1%82)%20%7C%20(status%3D%D0%9E%D1%82%D0%BA%D0%BB%D0%BE%D0%BD%D0%B5%D0%BD)

又名?filters=(status=closed)|(status=canceled)。但是如果我&在它之后添加一个和额外的括号来指定条件计算的顺序,它会失败并出现错误。

我还尝试减少括号的使用,并有这样的字符串(作为实验):

?filters=(status%3D%D0%97%D0%B0%D0%BA%D1%80%D1%8B%D1%82%20%7C%20status%3D%D0%9E%D1%82%D0%BA%D0%BB%D0%BE%D0%BD%D0%B5%D0%BD)

又名?filters=(status=closed | status=canceled)。这个不起作用 - 既没有错误也没有数据。

在我的情况下,我需要有一个混合的结果:状态(关闭和取消)和优先级=中间,但字符串格式不正确。请解释一下,哪种格式可以?

标签: vue.jsdjango-rest-framework

解决方案


这看起来不像您尝试在那里使用的对 uri 非常友好的语法。

尝试这样做:

?status[]=closed&status[]=cancelled&priority=middle

然后用于request.GET.getlist('status[]')取回列表并使用逻辑 OR 查询集过滤的值:

qs = qs.filter(status__in=request.GET.getlist('status[]', [])

然后添加任何作为逻辑与的附加过滤。

如果您使用的是 axios,它应该自动将 js statusurl 参数格式化为正确的格式。


推荐阅读