擅长:python、mysql、java
<p>我不熟悉Django的生态系统,但是Python标准库包含<code>ast.parse</code>,它解析一个有效的Python表达式字符串并生成一个抽象语法树,您可以解析并转换为一个查询或一系列函数调用,或者任何您需要的东西。所以如果你找不到更具体的东西,那么这个可能有用。你知道吗</p>
<p>此代码:</p>
<pre><code>ast.parse('donation_amount < 130 and donation_amount > 125')
</code></pre>
<p>返回以下AST结构:</p>
<pre><code>ast.Module(
ast.Expr([
ast.BoolOp(ast.And(), [
ast.Compare(
[ast.Lt()],
ast.Name('donation_amount', ast.Load()),
[ast.Num(130)]),
ast.Compare(
[ast.Gt()],
ast.Name('donation_amount', ast.Load()),
[ast.Num(125)])])]))
</code></pre>
<p>这样就可以进行解析了,但是您仍然需要将其转换为自己的查询。但看起来您只需要处理少量节点类型:</p>
<pre><code>BoolOp -> and, or
Compare -> ==, !=, >, <, >=, <=, in, not in
Name -> identifiers (column names, true/false/null, etc.)
Num -> numbers
Str -> strings
</code></pre>
<p>如果您想支持数据库功能,可以使用<code>ast.Call</code>节点;如果您想支持<code>IN</code>功能,可以使用<code>ast.Tuple</code>或<code>ast.List</code>节点。如果AST包含任何其他节点类型,则可以将其作为无效查询拒绝。你知道吗</p>