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 BeautifulSoup库抓取58手机维修信息
Nov 21 Python
Python设计模式之代理模式实例
Apr 26 Python
Python控制多进程与多线程并发数总结
Oct 26 Python
python requests 使用快速入门
Aug 31 Python
Python中super函数的用法
Nov 17 Python
Python+tkinter使用80行代码实现一个计算器实例
Jan 16 Python
Python通过cv2读取多个USB摄像头
Aug 28 Python
Python3将数据保存为txt文件的方法
Sep 12 Python
Python程序慢的重要原因
Sep 04 Python
Python爬虫基础之初次使用scrapy爬虫实例
Jun 26 Python
Python+Selenium实现读取网易邮箱验证码
Mar 13 Python
Python3使用Qt5来实现简易的五子棋小游戏
May 02 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
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
PHP面向对象之旅:深入理解static变量与方法
2014/01/06 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
PHP类的自动加载机制实现方法分析
2019/01/10 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
Javascript实现的分页函数
2007/02/07 Javascript
js 替换
2008/02/19 Javascript
jQuery 使用手册(一)
2009/09/23 Javascript
jQuery学习总结之元素的相对定位和选择器(持续更新)
2011/04/26 Javascript
JavaScript实现Java中StringBuffer的方法
2015/02/09 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
2015/08/07 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
使用JQuery 加载页面时调用JS的实现方法
2016/05/30 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
2016/08/23 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
Angular2 组件间通过@Input @Output通讯示例
2017/08/24 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
2019/03/13 Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
2019/04/24 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
Python入门篇之列表和元组
2014/10/17 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
tensorflow 实现从checkpoint中获取graph信息
2020/02/10 Python
Python3爬虫中pyspider的安装步骤
2020/07/29 Python
详解python UDP 编程
2020/08/24 Python
外语系大学生自荐信范文
2014/03/01 职场文书
优秀会计求职信
2014/07/04 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
vue实现同时设置多个倒计时
2021/05/20 Vue.js
springboot中一些比较常用的注解总结
2021/06/11 Java/Android