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自动化部署工具Fabric的简单上手指南
Apr 19 Python
Python多维/嵌套字典数据无限遍历的实现
Nov 04 Python
python交互式图形编程实例(三)
Nov 17 Python
纯python实现机器学习之kNN算法示例
Mar 01 Python
Python获取指定字符前面的所有字符方法
May 02 Python
python_opencv用线段画封闭矩形的实例
Dec 05 Python
Pycharm之快速定位到某行快捷键的方法
Jan 20 Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 Python
Python 中@property的用法详解
Jan 15 Python
keras tensorflow 实现在python下多进程运行
Feb 06 Python
Python如何操作office实现自动化及win32com.client的运用
Apr 01 Python
python线性插值解析
Jul 05 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中执行系统外部命令
2006/10/09 PHP
一周学会PHP(视频)Http下载
2006/12/12 PHP
PHP和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
2011/07/03 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
2015/01/22 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
javascript之typeof、instanceof操作符使用探讨
2013/05/19 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
基于JQuery实现分隔条的功能
2016/06/17 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
2017/04/20 Javascript
使用Vue实现图片上传的三种方式
2018/07/17 Javascript
详解小程序BackgroundAudioManager踩坑之旅
2019/12/08 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
python距离测量的方法
2018/03/06 Python
python3基于TCP实现CS架构文件传输
2018/07/28 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
解决Pandas的DataFrame输出截断和省略的问题
2019/02/08 Python
浅谈python3中input输入的使用
2019/08/02 Python
python画微信表情符的实例代码
2019/10/09 Python
python numpy中cumsum的用法详解
2019/10/17 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
Python3监控疫情的完整代码
2020/02/20 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
使用pandas实现筛选出指定列值所对应的行
2020/12/13 Python
中专毕业自我鉴定
2013/10/16 职场文书
中专毕业生求职简历的自我评价
2013/10/21 职场文书
小学生学雷锋演讲稿
2014/04/25 职场文书
2015毕业实习推荐信
2015/03/23 职场文书
户外亲子活动总结
2015/05/08 职场文书
安全生产会议制度
2015/08/06 职场文书
导游词之金鞭溪风景区
2019/09/12 职场文书