首页 > 其他分享 >DRF-筛选的高级用法

DRF-筛选的高级用法

时间:2022-12-01 17:15:34浏览次数:40  
标签:__ gt 用法 lt LOOKUP filters year 筛选 DRF

高级使用

实现模糊过滤,比如包含,大于,小于等等

1.编写自己的过滤器类

过滤器类和Django中表单类极其类似,写法基本一样,目的是指明过滤的时候使用哪些字段进行过滤,每个字段可以使用哪些运算。
运算符的写法基本参照Django的ORM中查询的写法,比如:大于等于,小于等于用“gte”,“lte”等等
模型层以图书表为例

# 单独写一个过滤器文件,首先导入模块
from django_filters.rest_framework import FilterSet
class AccountLabelFilterSet(FilterSet):
    class Meta:
        model = AccountLabel   # 模型类
        fields = ['source', 'product']   # 参与过滤的字段
Meta中出现的fields是指过滤条件中可以出现的字段,默认是精确判等
# source=1 and product=0
http://127.0.0.1:9998/oc_operating/api/label/account_label/?source=1&product=0
如果不是判等,可以自定义过滤字段进行过滤:

过滤器中常用的字段类型,这些类型要输模型中对应字段类型兼容
CharFilter         字符串类型
BooleanFilter      布尔类型
DateTimeFilter     日期时间类型
DateFilter         日期类型
DateRangeFilter    日期范围
TimeFilter         时间类型
NumberFilter       数值类型,对应模型中IntegerField, FloatField, DecimalField
参数说明:
field_name: 过滤字段名,一般应该对应模型中字段名
lookup_expr: 查询时所要进行的操作,和ORM中运算符一致
Meta字段说明
model: 引用的模型,不是字符串
fields:指明过滤字段,可以是列表,列表中字典可以过滤,默认是判等;也可以字典,字典可以自定义操作
exclude = ['password'] 排除字段,不允许使用列表中字典进行过滤
自定义过滤字段:
from django_filters.rest_framework import FilterSet
from django_filters.rest_framework import filters

class AccountLabelFilterSet(FilterSet):
    btitle = filters.CharFilter(field_name='title',lookup_expr='icontains')
    pub_year = filters.CharFilter(field_name='bpub_date',lookup_expr='year')
    pub_year__gt = filters.CharFilter(field_name='bpub_date',lookup_expr='year__gt')
    bread__gt = filters.NumberFilter(field_name='bread',lookup_expr="gt")
    bread__lt = filters.NumberFilter(field_name='bread',lookup_expr="lt")

    class Meta:
        model = Bookinfo
        fields = ['title','bread','bcomment']
自定义字段名可以和模型中不一致,但一定要用参数field_name指明对应模型中的字段名

日期查询

#定义按年查询,
pub_year = filters.CharFilter(field_name='bpub_date',lookup_expr='year')
# 年份应该大于某值
pub_year__gt = filters.CharFilter(field_name='bpub_date',lookup_expr='year__gt')
#年份应该小于某值
bread__lt = filters.NumberFilter(field_name='bread',lookup_expr="lt")
示例:
http://127.0.0.1:8000/book/?title=&bread=&bcomment=&btitle=&pub_year=&pub_year__gt=2014&bread__gt=&bread__lt=
查询结果:
[
    {
        "id": 1,
        "title": "射雕英雄传",
        "bpub_date": "2020-02-18",
        "bread": 30,
        "bcomment": 80,
        "bimage": null
    }
]

2.视图集中应用

class AccountLabelViewSet(DRFBaseViewSet):
    ...
    # filter_fields = ['source', 'product']
    filterset_class = AccountLabelFilterSet

过滤器的高级应用需要配置多种数据类型的处理方式和自定义一个过滤器类。

在应用路径(book)下创建一个filters.py文件
filters.py里面主要包含两部分,一是各种数据类型的处理方式,比如布尔类型、字符串、时间等等,二是为视图类编写过滤器类,下面的代码中为BookInfoModelViewSet编写的过滤器类。
from django_filters import rest_framework as filters
from . import models

BOOLEAN_LOOKUP = [
'isnull',
'exact',
'in',
]

STRING_LOOKUP = [
'iexact',
'contains',
'icontains',
'startswith',
'istartswith',
'endswith',
'iendswith',
'regex',
'iregex',
] + BOOLEAN_LOOKUP

NUMBER_LOOKUP = [
'gt',
'gte',
'lt',
'lte',
'range',
] + BOOLEAN_LOOKUP

DATE_LOOKUP = [
'year',
'year__gt',
'year__gte',
'year__lt',
'year__lte',
'month',
'month__gt',
'month__gte',
'month__lt',
'month__lte',
'day',
'day__gt',
'day__gte',
'day__lt',
'day__lte',
'week',
'week__gt',
'week__gte',
'week__lt',
'week__lte',
'week_day',
'week_day__gt',
'week_day__gte',
'week_day__lt',
'week_day__lte',
'quarter',
'quarter__gt',
'quarter__gte',
'quarter__lt',
'quarter__lte',
] + NUMBER_LOOKUP

TIME_LOOKUP = [
'hour',
'hour__gt',
'hour__gte',
'hour__lt',
'hour__lte',
'minute',
'minute__gt',
'minute__gte',
'minute__lt',
'minute__lte',
'second',
'second__gt',
'second__gte',
'second__lt',
'second__lte',
] + NUMBER_LOOKUP

DATETIME_LOOKUP = set([
'date',
'date__gt',
'date__gte',
'date__lt',
'date__lte',
'time',
'time__gt',
'time__gte',
'time__lt',
'time__lte',
] + DATE_LOOKUP + TIME_LOOKUP)

RESOLUTIONS = [
'years',
'months',
'days',
'hours',
'minutes',
'seconds',
]

TRUNC_DATETIME = [
'year',
'quarter',
'month',
'week',
'day',
'hour'
]


class BookInfoFilter(filters.FilterSet):
'''
为图书信息API配置过滤器
'''
class Meta:
model = models.BookInfo # 指定作用的数据库模型类
# 指定需要为哪些字段设置过滤器
fields = {
'id': NUMBER_LOOKUP,
'title': STRING_LOOKUP,
'pub_date': DATE_LOOKUP,
'read': NUMBER_LOOKUP,
'is_delete': BOOLEAN_LOOKUP
}

在视图类中添加filter_class字段
class BookInfoModelViewSet(ModelViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
ordering_fields = ('id', 'title')
filter_class = BookInfoFilter # 指定过滤器类

到这里就可以使用过滤器了。
查询id大于10的书: GET /books/bookinfos/?id__gte=10
查询出版年份早于1986年的书: GET /books/bookinfos/?pub_date__year__lt=1986
查询书本名字以“天”开头的书: GET /books/bookinfos/?title__startswith=天
过滤器的高级使用基本就是这样

标签:__,gt,用法,lt,LOOKUP,filters,year,筛选,DRF
From: https://www.cnblogs.com/fan-1994716/p/16941994.html

相关文章

  • C#的switch的用法及模式匹配
    switch-case语句经常被认为是if-else语句的替代品,但是在众多程序语言中还是能见到switch的存在,这很大程度上是因为switch更实用,这一点在C#中更能提现。简单的语......
  • Js 数组筛选重复项
    js数组去重复:Array.prototype.distinct=function(){vararr=this,result=[],i,j,len=arr.length;for(i=0;i<len;......
  • html使用frame框架目录导航跳转至指定章节的用法
    html使用frame框架导航跳转至指定节的用法,实现在同一个页面中不使用js进行页面的跳转。左边页面是目录页,右边是内容页。点击左边目录,右边内容页跳转到相应的章节。实现代......
  • python not的用法
    在python中None,False,空字符串"",0,空列表[],空字典{},空元组()都相当于False,即:notNone==notFalse==not''==not0==not[]==not{}==not()......
  • IOS的delegate 设计模式,用法及利于其编写列表 UITableView(具体编写)
    delegate设计模式,用法及利于其编写列表UITableView(具体编写)在app中必须用到的设计模式,也是最常用的UITanView视图展示,协助管理,不管数据。简单列表编写self.view.backg......
  • 高手系列!数据科学家私藏pandas高阶用法大全 ⛵
    ......
  • find 命令 的 7 种高级用法
    可以很肯定地说,find命令是Linux后台开发人员必须熟知的操作之一,除非您使用的是WindowsServer。对于技术面试,它也是一个热门话题。让我们看一道真题:如果你的Linux服务......
  • Oracle中ALTER TABLE的五种用法(四、五)
    首发微信公众号:SQL数据库运维原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1&sn=450e9e94fa709b5eeff0de371c62072b&chksm=ea37536cdd......
  • torch.autograd.Function 用法及注意事项
    众所周知,作为深度学习框架之一的PyTorch和其他深度学习框架原理几乎完全一致,都有着自动求导机制,当然也可以说成是自动微分机制。有些时候,我们不想要它自带的求导机制,需要......
  • selenium高级用法:获取经纬度
    导言获取经纬度的方法有很多,通过调用某地图API,模块geopy。但这两种方式都有一定的缺点,调用某地图API访问次数有限,使用模块geopy虽然次数不受限制,但是这个模块只能精确到镇,如......