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入门教程1. 基本运算【四则运算、变量、math模块等】
Oct 28 Python
Python面向对象基础入门之设置对象属性
Dec 11 Python
Django实现学员管理系统
Feb 26 Python
python3+selenium自动化测试框架详解
Mar 17 Python
python爬虫 批量下载zabbix文档代码实例
Aug 21 Python
Python pandas实现excel工作表合并功能详解
Aug 29 Python
python 通过邮件控制实现远程控制电脑操作
Mar 16 Python
基于python检查矩阵计算结果
May 21 Python
Python学习之os模块及用法
Jun 03 Python
Python如何将字符串转换为日期
Jul 31 Python
Python3基于plotly模块保存图片表格
Aug 03 Python
python元组打包和解包过程详解
Aug 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
PHP 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
phpMyadmin 用户权限中英对照
2010/04/02 PHP
php define的第二个参数使用方法
2013/11/04 PHP
ThinkPHP模板中判断volist循环的最后一条记录的验证方法
2014/07/01 PHP
thinkPHP查询方式小结
2016/01/09 PHP
Yii2中使用asset压缩js,css文件的方法
2016/11/24 PHP
php实现的生成排列算法示例
2019/07/25 PHP
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
JS中字符串trim()使用示例
2015/05/26 Javascript
Jquery 全选反选实例代码
2015/11/19 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
vue开发心得和技巧分享
2016/10/27 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
React根据宽度自适应高度的示例代码
2017/10/11 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
Python 调用DLL操作抄表机
2009/01/12 Python
python实现简单的TCP代理服务器
2014/10/08 Python
Python的多态性实例分析
2015/07/07 Python
python递归法实现简易连连看小游戏
2020/03/25 Python
python实现网站微信登录的示例代码
2019/09/18 Python
Python JSON编解码方式原理详解
2020/01/20 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
如何在scrapy中捕获并处理各种异常
2020/09/28 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
Ratchet 模态框的实现
2020/08/19 HTML / CSS
世界读书日的活动方案
2014/08/20 职场文书
创先争优个人承诺书
2014/08/30 职场文书
2014年度考核工作总结
2014/12/24 职场文书
跳高加油稿
2015/07/21 职场文书
Java 中的 Lambda List 转 Map 的多种方法详解
2022/07/07 Java/Android