将布尔字符串查询传递给Django

时间:2015-05-18 15:08:33

标签: javascript python mysql django pyparsing

我有一个文本区域,允许用户构建自己的字符串,这可能看起来像单词之间的AND OR NOT混合

前:

"'disease' AND 'chemical' OR 'toxic' NOT 'imflammation' AND ('foo' OR 'bar')"

他们可以从列表中添加单词,可以单击相应的按钮添加AND OR NOT,并添加括号。所以这样的字符串将从我的javascript传递给Django,让我解析/格式化以进行查询。我无法找到很多关于构建一个Django查询的方法来处理这样的布尔查询。我真的不知道从哪里开始。我也在后端运行MySQL。谢谢你的帮助!

编辑:我查询的表格有一个文本列,搜索将针对该表格。我试图避免在Django中进行原始的SQL搜索。我目前正在搜索可以将任何MySQL查询转换为适当的Django查询的方法,或者直接从字符串中获取字符串和构建Django查询的方法(括号是我认为的难点)。

2 个答案:

答案 0 :(得分:2)

我假设你有一个存储在数据库中的设定值,它们是布尔值。如果是这样,请查看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注入,并且此解决方案没有这种危险。

答案 1 :(得分:0)

我在pyparsing和一个名为simpleBool的脚本中找到了一个答案,它让我从我的问题格式的HTML文本区域发送一个字符串到Django,我能够以这种方式制作Q对象。 pyparsing很棒而且simpleBool帮了很多我建议任何想要动态构建查询的人都可以使用嵌套查询。