Django-rest-framework中过滤器的定制实例


Posted in Python onApril 01, 2020

1、定义一个自定义的filter.py模块,增加一个新的过滤类

import django_filters
#这个Q可以支持表查询,单下划线获取表字段,双下划线获取关联表,
from django.db.models import Q
#引入自己的模型
from app.item.models import ItemCategory
#自定义的过滤类,需要继承django_filter.rest_framework中的FilterSet类
class ItemCategoryFilter(django_filters.rest_framework.FilterSet):
  Filter_category = django_filters.NumberFilter(method='category_filter', label='Filter_category')
  #django_filters.NumberFilter类似,ModelForm中字段类型的控制
  #其中method指向自己定义的过滤函数,label用于标识在测试API界面中的过滤界面字段,Filter_category控制查询字段
  def category_filter(self, queryset, name, value):
    #这里用到多级联表查询
    return queryset.filter(Q(category_id=value)|Q(category__parent_id=value)|Q(category__parent__parent_id=value)|Q(category__parent__parent__parent_id=value))
  class Meta:
    model = ItemCategory
    fields = []

2、将视图处理类中的,过滤器后端重新指定,将过滤器类连接到我们自定义实现的处理类上

class ItemsListByCategory(generics.ListCreateAPIView):
  '''
    根据category编号获取相关模型no。
    请求中请带有参数category
    @:require param: category
    such as: GET /itemsListByCategory/?Filter_category=2
  '''
  from django_filters.rest_framework import DjangoFilterBackend
  from app.item.filters import ItemCategoryFilter

  queryset = ItemCategory.objects.all()
  serializer_class = ItemCategorySerializer
  pagination_class = CommonPagination
  # 在这里哦
  filter_backends = (DjangoFilterBackend,)
  filter_class =ItemCategoryFilter
  permission_classes = (ReadOnly,)

补充知识:Django restful framework 中的 filter 自定义过滤

class AlertFilter(django_filters.rest_framework.FilterSet):
  
   .......
  to_bearer_service = django_filters.rest_framework.CharFilter(method='to_bearer_service_filter', label='bearer_service')

  class Meta:
    model = Alert
    fields = [......, 'to_bearer_service']

  @staticmethod  # 如果想获取请求信息可以去掉这个静态方法的装饰器,为什么要加静态方法装饰器我也不清楚
  def to_bearer_service_filter(queryset, name, value):
    Q_id = Q()
    for i in value.split(","):
      if i == "0":
        Q_id.add(Q(**{'to_bearer_service':None}), Q.OR)
      else:
        Q_id.add(Q(**{'to_bearer_service_id': int(i)}), Q.OR)
    queryset = queryset.filter(Q_id)
    return queryset
 
 
  def to_bearer_service_filter(self, queryset, name, value):
    Q_id = Q()
    for i in value.split(","):
      if i == "0":
        Q_id.add(Q(**{'to_bearer_service':None}), Q.OR)
      else:
        Q_id.add(Q(**{'to_bearer_service_id': int(i)}), Q.OR)
    queryset = queryset.filter(Q_id)
    return queryset

以上这篇Django-rest-framework中过滤器的定制实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python uuid模块使用实例
Apr 08 Python
pygame播放音乐的方法
May 19 Python
python基础教程之Filter使用方法
Jan 17 Python
Python图片裁剪实例代码(如头像裁剪)
Jun 21 Python
Python语言实现将图片转化为html页面
Dec 06 Python
Python实现多态、协议和鸭子类型的代码详解
May 05 Python
pymysql模块的使用(增删改查)详解
Sep 09 Python
Python使用OpenPyXL处理Excel表格
Jul 02 Python
Django中Aggregation聚合的基本使用方法
Jul 09 Python
Python plt 利用subplot 实现在一张画布同时画多张图
Feb 26 Python
解决Pytorch半精度浮点型网络训练的问题
May 24 Python
用python画城市轮播地图
May 28 Python
Python如何操作office实现自动化及win32com.client的运用
Apr 01 #Python
Django之choices选项和富文本编辑器的使用详解
Apr 01 #Python
Python AutoCAD 系统设置的实现方法
Apr 01 #Python
django实现模型字段动态choice的操作
Apr 01 #Python
Python气泡提示与标签的实现
Apr 01 #Python
django 多数据库及分库实现方式
Apr 01 #Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 #Python
You might like
利用PHP生成静态HTML文档的原理
2012/10/29 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
php+Ajax无刷新验证用户名操作实例详解
2019/03/04 PHP
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
node.js中的http.response.writeHead方法使用说明
2014/12/14 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
解决vue-cli 打包后自定义动画未执行的问题
2019/11/12 Javascript
[19:15]DK战队纪录片
2014/09/02 DOTA
[00:32]2016完美“圣”典风云人物:Maybe宣传片
2016/12/05 DOTA
Python模拟登录验证码(代码简单)
2016/02/06 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
Python中如何获取类属性的列表
2016/12/26 Python
Python tornado上传文件的功能
2020/03/26 Python
python三引号如何输入
2020/07/06 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
美的官方商城:Midea
2016/09/14 全球购物
Rentalcars.com中国:世界上最大的在线汽车租赁服务
2019/08/22 全球购物
会计应届生的自荐信
2013/12/13 职场文书
幼儿园招生广告
2014/03/19 职场文书
建筑工地门卫岗位职责
2014/04/30 职场文书
小学生常见病防治方案
2014/06/06 职场文书
代办委托书怎么写
2014/08/01 职场文书
2014离婚协议书范文
2014/09/10 职场文书
八年级作文之友情
2019/11/25 职场文书