为django-rest-framework提供的RQL过滤器后端
项目描述
此应用程序实现了针对django-rest-framework的RQL/RSQL/FIQL过滤器后端,并允许传递任意的条件表达式来过滤实体。
安装
pip install django-rql-filter
用法
将 rql_filter 添加到您的项目 INSTALLED_APPS。
将 RQLFilterBackend 添加到您的视图集 filter_backends
from rql_filter.backend import RQLFilterBackend
class ThingyViewSet(viewsets.ReadOnlyModelViewSet):
filter_backends = (
...
RQLFilterBackend,
...
)
您现在可以通过使用 q 查询字符串参数将RQL/RSQL/FIQL查询传递到API URL。
curl http://my.app/api/thingies/?format=json&q=name==bob;age=gt=30
查询语法
查询是通过字段比较的组合来完成的。比较由字段名称、运算符和值组成。
运算符 |
含义 |
示例 |
---|---|---|
== |
等于 |
name==bob |
!= |
不等于 |
name!=bob |
< =lt= |
小于 |
age<30 age=lt=30 |
<= =le= |
小于或等于 |
age<=30 age=le=30 |
> =gt= |
大于 |
age>30 age=gt=30 |
>= =ge= |
大于或等于 |
age>=30 age=ge=30 |
=in= |
属于集合 |
name=in=(bob,kate) |
=out= |
不属于集合 |
name=out=(bob,kate) |
比较可以通过使用双下划线分隔字段名称来遍历模型关系: father__name==bob。
当值包含特殊字符或空格时,必须用单引号或双引号引用: name=="bob katz"。
可以使用逻辑运算符组合比较: ; 用于逻辑 AND,和 , 用于逻辑 OR: name=="bob";age>=30。AND 优先于 OR;可以使用括号进行分组: name=="bob";(age>=30,age<3)。
注意: RQL/RSQL/FIQL 的支持仍然不完整,它将在未来得到增强。
配置
RQL_FILTER_QUERY_PARAM 设置要使用的查询字符串参数名称;默认为 'q'。
在不使用 rest-framework 的情况下使用
您可以在 rest-framework 视图集外部手动使用后端
from rql_filter.backend import RQLFilterBackend
# May be reused any number of times
backend = RQLFilterBackend()
# Fake request object
class FakeRQLRequest:
def __init__(self, q):
self.GET = {'q': q}
qs = Thingy.objects.all()
filtered_qs = backend.filter_queryset(
FakeRQLRequest('name==bob;age=gt=30'),
qs,
None
)
测试
安装测试依赖项
pip install -e .[testing]
运行测试
py.test
项目详情
django-rql-filter-0.1.3.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e8d7f6a67066feea6733a51151e92a480aeb7166fbb6ece5167c014c4f9fa688 |
|
MD5 | 2060cb2e86444ed9b1531500d704c6a3 |
|
BLAKE2b-256 | b2aaf1f6bfbedba0d3e4c9a71e578201d0fa23162fc77d41eb3ab92f9bd86dba |