Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的搜索条件语言解析器?_Python_Django_Parsing_Django Rest Framework - Fatal编程技术网

Python中的搜索条件语言解析器?

Python中的搜索条件语言解析器?,python,django,parsing,django-rest-framework,Python,Django,Parsing,Django Rest Framework,我正在用Django编写一个web应用程序,并为我的学校编写一个内部应用程序。它是一个非常古老的国产应用程序的替代品,该应用程序是用MicrosoftAccess2003编写的。我的用户非常希望拥有的功能之一是能够搜索字段(例如,捐赠表中的捐赠金额),不仅可以搜索确切金额,还可以使用如下查询: < 130 and > 125 125 Access目前允许这种功能,而且非常有用,但是我完全不知道有什么方法可以实现类似的功能,而不将查询直接插入SQL(非常危险)或在Python表达式

我正在用Django编写一个web应用程序,并为我的学校编写一个内部应用程序。它是一个非常古老的国产应用程序的替代品,该应用程序是用MicrosoftAccess2003编写的。我的用户非常希望拥有的功能之一是能够搜索字段(例如,
捐赠
表中的
捐赠金额
),不仅可以搜索确切金额,还可以使用如下查询:

< 130 and > 125
<130和>125
Access目前允许这种功能,而且非常有用,但是我完全不知道有什么方法可以实现类似的功能,而不将查询直接插入SQL(非常危险)或在Python表达式中使用
eval
(甚至更危险)


是否有任何库或子语言允许这样做?

是否使用Django ORM对数据库建模?如果是这样的话,那不是归结为:

 Donation.objects.filter(donation_amount__lte=130).filter(donation_amount__gte=125)

我不熟悉Django的生态系统,但Python标准库包含
ast.parse
,它解析一个有效的Python表达式字符串并生成一个抽象语法树,您可以将其解析并转换为查询或一系列函数调用,或任何您需要的内容。因此,如果你找不到更具体的东西,那么这可能是有用的

此代码:

ast.parse('donation_amount < 130 and donation_amount > 125')
这样就可以进行解析,但您仍然需要将其转换为自己的查询。但看起来您只需要处理少量节点类型:

BoolOp -> and, or
Compare -> ==, !=, >, <, >=, <=, in, not in
Name -> identifiers (column names, true/false/null, etc.)
Num -> numbers
Str -> strings
BoolOp->and,或
比较->=,!=,>,=,标识符(列名、真/假/空等)
数字->数字
Str->strings

如果要支持数据库功能,可以调用
ast.Call
节点;如果要支持
中的
功能,可以调用
ast.Tuple
ast.List
节点。如果AST包含任何其他节点类型,您可以将其作为无效查询拒绝。

您完全正确,就是这么简单。然而,问题是如何(安全地)将字符串解析成我可以在代码中识别的东西,然后转换成您展示的Django代码。
BoolOp -> and, or
Compare -> ==, !=, >, <, >=, <=, in, not in
Name -> identifiers (column names, true/false/null, etc.)
Num -> numbers
Str -> strings