tastypie 的过滤器是用来对http请求进行一些条件进行查询来实现数据过滤, 将符合要求的数据返回给api接口的一个过程.下面主要针对tastypie的基于 Django的Model的Resource来对相关的过滤机制进行描述.
过滤器条件的原始数据来源: 各种视图方法
原始数据来源有2个:
在使用场景中, HTTP 请求参数 我们不需要进行处理, 但是可以通过修改 kwargs 来添加额外的过滤条件, 可能会用在对当前登录用户进行数据过滤的场景
构建完善的过滤器条件集合: build_filters
对原始数据中的每个过滤条件进行以下处理:
2.1 忽略掉非 tastypie Resource 字段
2.2 检查过滤条件的 过滤字段名, 过滤类型并返回对应的Django Model 的属性字段: check_filtering(field_name, filter_type, filter_bits) 过滤字段以及过滤类型必须在Resource 中的 Meta 的 filtering 中进行配置, 见 filtering config 根据给定的字段名称, 过滤类型以及可选的额外关系来查看对应的字段是否可以用来过滤
- 检查给定的字段名称是否在 Meta 的 filtering 选项中指定
- 检查给定的过滤类型是否在 filtering 选项中指定
- 检查给定的字段是否具有'attribute' 可以用来进行查询过滤
- 检查给定字段是否为一个关系字段以及该关系字段是否是可以过滤的
- 返回一个用来构造Django Model查询条件的lookup列表
2.3 对过滤条件的字段值进行处理将其转换为对应的 Python 对象: filter_value_to_python(value)
1. 使用 string_to_python 来将常见的字符串转化为 True/False/None 值
2. 如果对应的过滤类型为 in/range, 会将传入的字符串值通过','进行分割来转换为列表对象
2.4 将最后得到的过滤条件集合中的键值由 unicode 转换为 ascii 字符串: dict_strip_unicode_keys
使用 django.utils.encoding 中的 smart_bytes() 来进行转换
应用构建好的过滤器来进行数据过滤处理: apply_filters() 直接调用 get_object_list().filters(**filters) 来将之前构造好的过滤条件仅行过滤 get_object_list 的实现就是直接来自于 Meta 的 queryset 查询集合
通过过滤器获得得到的结果再进行访问权限验证并返回: self.authorized_read_list(objects, bundle)
为了使用tastypie的过滤器, 首先我们需要在tastypie 的资源类的Meta选项的 filtering 属性中 指定可以过滤的字段名称以及过滤查询方式, 如:
filtering ={
'field_name': ALL/ALL_WITH_RELATION/[django model lookup name list]
}
此处需要注意以下几点:
field_name 对应的tastypie 的字段名, 而不是Django Model类的字段名称, 它们可以一样,但是不必须
字段的过滤查询条件可以使用tastypie 定义的两个常量 ALL 和 ALL_WITH_RELATION, 也可以使用django Model的查询中使用的 所有以下值的字面量值:
exact
iexact
contains
icontains
in
range
gt
gte
lt
lte
startswith
istartswith
endswith
iendswith
date
year
month
day
week
week_day
time
hour
minute
second
isnull
search
regex
iregex
当需要对指定的tastypie字段进行过滤时,必须在 filtering 中指定对应的字段名称, 否则一旦过滤器中出现了相应的字段过滤条件, 在检查过滤条件时不能通过检查,会报错.