向Django传递一个布尔字符串查询
Pass a Boolean String Query to Django
我有一个文本区,让用户建立自己的字符串,可能看起来像单词之间的任何AND或NOT的组合
,
"'disease' AND 'chemical' OR 'toxic' NOT 'imflammation' AND ('foo' OR 'bar')"
他们能够从列表中添加单词,可以单击适当的按钮添加AND或NOT,并添加括号。所以像这样的字符串将从我的javascript传递给Django,让我解析/格式化以进行查询。我找不到太多关于构建一个Django查询来处理这样的布尔查询。我真不知道该从何说起。我也在后台运行MySQL。谢谢你的帮助!
edit:我正在查询的表有一个文本列,搜索将指向该列。我试图避免在Django中进行原始sql搜索。我目前正在寻找的东西,既可以转换任何MySQL查询到适当的Django查询或方法采取字符串和构建Django查询直接从字符串(括号是困难的部分,我认为)。
我假设您在数据库中存储了一组值,这些值是布尔值。如果是这样,请查看pyparsing。您可以使用简单的字符串替换使查询可解析并构建表达式。然后,您可以用从数据库中获取的值替换变量并对其进行计算。
from sympy.parsing.sympy_parser import parse_expr
from sympy import symbols
# define all your symbols
A, B, C, D = symbols('A,B,C,D')
a, b, c, d = fetch_from_database()
user_expr_str = '(A & B) | C' # Change AND to &, OR to | and so on...
try:
expr = parse_expr(user_expr_str)
except SyntaxError:
# Do sth with error like return
# Evaluate the expression using data from DB
result = e.subs({A: a, B: b, C: c, D: d})
在最后一行中可以放置所有值,而不仅仅是表达式中使用的值。
值得一提的是,根据用户输入构建查询可能会使您暴露于SQL注入,而此解决方案没有这种危险。
我在pyparsing和一个名为simpleBool的脚本中找到了答案,该脚本允许我从我的HTML文本区发送格式的字符串,从我的问题到Django,我能够以这种方式制作Q对象。pyparsing非常棒,simpleBool帮助很大,我建议任何想要动态构建可能由嵌套查询组成的查询的人使用它。
相关文章:
- 将多个布尔检查简化为一个布尔检查
- Coffeescript:添加一个由布尔值控制的条件类名
- RegisterClientScriptBlock - confirm box 返回一个布尔值给 aspx.cs
- JavaScript:为什么布尔值的按位 OR 返回一个数字而不是一个布尔值
- JavaScript后缀了一个用于限制事件的布尔值/一次性标志
- 只检查一个布尔选项集
- 返回一个布尔值的Angularjs自定义服务方法
- 在javascript中,是一个空字符串,作为布尔值总是为false
- 我怎么能返回一个空对象同时空对象等于布尔值false在javascript
- 存储一个布尔值或整型值,并在页面加载后检查/更改它的值
- 通过javascript在java中设置一个布尔标志
- 是否有可能搜索一个布尔在蒙古与ajax帖子没有服务器端转换
- 这是一个很好的实践乘以一个布尔值在javascript上
- 如果没有被使用,为什么返回一个布尔值
- 这是一个布尔逻辑
- 无法让 RegisterClientScriptBlock() 方法在传递“true”作为最后一个布尔参数时工作
- 我们可以在aspx页面加载控件时传递一个布尔变量吗?
- 如何在MongoDB中查询一个布尔值的字段,并返回一个布尔值,无论它是true还是false
- 向Django传递一个布尔字符串查询
- indexOf != -1返回一个布尔值吗?