坐看云起时|

一枚码农

园龄:7年6个月粉丝:5关注:1

drf 过滤

简单使用

1.下载

pip install django-filter

2.配置setting.py

# setting.py
# 需要先在应用里注册,像rest_framework
INSTALLED_APPS = [
    ...
    'django_filters',  # 需要注册应用,
]

REST_FRAMEWORK = {
    ...
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
}

3.在视图集中添加过滤字段

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

4.使用

# # source=1 and product=0
http://127.0.0.1:9998/oc_operating/api/label/account_label/?source=1&product=0

高级使用

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

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

本文作者:一枚码农

本文链接:https://www.cnblogs.com/yimeimanong/p/16207325.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   一枚码农  阅读(127)  评论(0编辑  收藏  举报
 
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 Sold Out Hawk
  2. 2 光辉岁月 Beyond
光辉岁月 - Beyond
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 黄家驹

作曲 : 黄家驹

编曲 : Beyond

制作人 : Beyond/Gordon O'Yang

Synth Programming : Gordon O'Yang / 叶世荣

Mixed by Philip Kwok

钟声响起归家的讯号

钟声响起归家的讯号

在他生命里

仿佛带点唏嘘

黑色肌肤给他的意义

是一生奉献 肤色斗争中

年月把拥有变做失去

疲倦的双眼带着期望

今天只有残留的躯壳

迎接光辉岁月

风雨中抱紧自由

一生经过彷徨的挣扎

自信可改变未来

问谁又能做到

可否不分肤色的界限

可否不分肤色的界限

愿这土地里

不分你我高低

缤纷色彩闪出的美丽

是因它没有

分开每种色彩

年月把拥有变做失去

疲倦的双眼带着期望

今天只有残留的躯壳

迎接光辉岁月

风雨中抱紧自由

一生经过彷徨的挣扎

自信可改变未来

问谁又能做到

今天只有残留的躯壳

今天只有残留的躯壳

迎接光辉岁月

风雨中抱紧自由

一生经过彷徨的挣扎

自信可改变未来

问谁又能做到

Woo

Ah

Ah

今天只有残留的躯壳

今天只有残留的躯壳

迎接光辉岁月

风雨中抱紧自由

一生经过彷徨的挣扎

自信可改变未来

问谁又能做到

Woo

Ah

Ah

今天只有残留的躯壳

今天只有残留的躯壳

迎接光辉岁月

风雨中抱紧自由

一生经过彷徨的挣扎

自信可改变未来