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

Pass a Boolean String Query to Django

我有一个文本区域,让用户可以构建自己的字符串,它可能看起来像单词之间的 AND OR NOT 的任意组合

例如:

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

他们能够从列表中添加单词,可以单击相应的按钮添加 AND OR NOT,并添加括号。所以像这样的字符串将从我的 javascript 传递到 Django 以供我 parse/format 进行查询。不过,我找不到太多有关构建将处理此类布尔查询的 Django 查询的信息。我真的不知道从哪里开始。我也在后端 运行 MySQL。感谢您的帮助!

编辑:我正在查询的 table 有一个文本列,搜索将指向该列。我试图避免在 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 and a script called simpleBool 中找到了一个答案,它让我从我的 HTML 格式的文本区域中将一个字符串从我的问题发送到 Django,并且我能够以这种方式制作 Q 对象。 pyparsing 很棒,simpleBool 帮了很多忙,我建议任何希望动态构建可能包含嵌套查询的查询的人使用它。