当前位置: 首页 > 工具软件 > Tastypie > 使用案例 >

Tastypie 资源过滤器的相关机制介绍

和嘉澍
2023-12-01


tastypie 的过滤器是用来对http请求进行一些条件进行查询来实现数据过滤, 将符合要求的数据返回给api接口的一个过程.下面主要针对tastypie的基于 Django的Model的Resource来对相关的过滤机制进行描述.

1. 在api调用时的过滤器生成以及使用流程描述

  1. 过滤器条件的原始数据来源: 各种视图方法

    原始数据来源有2个:

    • HTTP 的请求参数: request.GET.copy()
    • Django URLConf 中的 kwargs 参数传入值: **kwargs

在使用场景中, HTTP 请求参数 我们不需要进行处理, 但是可以通过修改 kwargs 来添加额外的过滤条件, 可能会用在对当前登录用户进行数据过滤的场景

  1. 构建完善的过滤器条件集合: 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() 来进行转换
    
  2. 应用构建好的过滤器来进行数据过滤处理: apply_filters() 直接调用 get_object_list().filters(**filters) 来将之前构造好的过滤条件仅行过滤 get_object_list 的实现就是直接来自于 Meta 的 queryset 查询集合

  3. 通过过滤器获得得到的结果再进行访问权限验证并返回: self.authorized_read_list(objects, bundle)

filtering-config

为了使用tastypie的过滤器, 首先我们需要在tastypie 的资源类的Meta选项的 filtering 属性中 指定可以过滤的字段名称以及过滤查询方式, 如:

    filtering ={
        'field_name': ALL/ALL_WITH_RELATION/[django model lookup name list]
    }

此处需要注意以下几点:

  1. field_name 对应的tastypie 的字段名, 而不是Django Model类的字段名称, 它们可以一样,但是不必须

  2. 字段的过滤查询条件可以使用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 中指定对应的字段名称, 否则一旦过滤器中出现了相应的字段过滤条件, 在检查过滤条件时不能通过检查,会报错.

 类似资料: