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使用Srapy框架爬虫模拟登陆并抓取知乎内容
Jul 02 Python
requests和lxml实现爬虫的方法
Jun 11 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
python正则表达式面试题解答
Apr 28 Python
Python中修改字符串的四种方法
Nov 02 Python
使用PIL(Python-Imaging)反转图像的颜色方法
Jan 24 Python
python获取磁盘号下盘符步骤详解
Jun 19 Python
python实现共轭梯度法
Jul 03 Python
简单的Python调度器Schedule详解
Aug 30 Python
Python 中list ,set,dict的大规模查找效率对比详解
Oct 11 Python
Python利用socket模块开发简单的端口扫描工具的实现
Jan 27 Python
简单介绍Python的第三方库yaml
Jun 18 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相当简单的分页类
2008/10/02 PHP
学习php笔记 字符串处理
2010/10/19 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
input file获得文件根目录简单实现
2013/04/26 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
CI框架Session.php源码分析
2014/11/03 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
php提高脚本性能的4个技巧
2020/08/18 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
Python基于DES算法加密解密实例
2015/06/03 Python
Python实现模拟时钟代码推荐
2015/11/08 Python
详解Python中的静态方法与类成员方法
2017/02/28 Python
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
python编写微信远程控制电脑的程序
2018/01/05 Python
解决Python3 被PHP程序调用执行返回乱码的问题
2019/02/16 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
2021/01/12 Python
Linux内核产生并发的原因
2012/07/13 面试题
业务员岗位职责
2013/11/16 职场文书
大学学习生活感言
2014/01/18 职场文书
党员公开承诺事项
2014/03/25 职场文书
2014年会策划方案
2014/05/11 职场文书
小学生保护环境倡议书
2014/05/15 职场文书
美术专业自荐信
2014/07/07 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
安全教育观后感
2015/06/17 职场文书
运动会加油稿
2015/07/22 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
Java 超详细讲解hashCode方法
2022/04/07 Java/Android
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS