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使用循环实现批量创建文件夹示例
Mar 25 Python
简单解决Python文件中文编码问题
Nov 22 Python
Python如何获取系统iops示例代码
Sep 06 Python
python回调函数中使用多线程的方法
Dec 25 Python
使用Python进行QQ批量登录的实例代码
Jun 11 Python
python tkinter控件布局项目实例
Nov 04 Python
基于Python中isfile函数和isdir函数使用详解
Nov 29 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
Feb 07 Python
Django用户身份验证完成示例代码
Apr 03 Python
利用Python将图片中扭曲矩形的复原
Sep 07 Python
python实现KNN近邻算法
Dec 30 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中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
php中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
javascript 多浏览器 事件大全
2010/03/23 Javascript
ajax中get和post的说明及使用与区别
2012/12/23 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
javascript刷新父页面的各种方法汇总
2014/09/03 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
2015/12/23 Javascript
jQuery+Ajax实现无刷新操作
2016/01/04 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
2018/02/11 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
vue实现倒计时获取验证码效果
2020/04/17 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
2020/09/02 Javascript
[54:51]Ti4 冒泡赛第二轮LGD vs C9 3
2014/07/14 DOTA
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
Python实现控制台进度条功能
2016/01/04 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
详解Python 切片语法
2019/06/10 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
通过实例解析Python RPC实现原理及方法
2020/07/07 Python
可打印的优惠券、杂货和优惠券代码:Coupons.com
2018/06/12 全球购物
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
卡骆驰英国官网:Crocs英国
2019/08/22 全球购物
请解释接口的显式实现有什么意义
2012/05/26 面试题
车间工艺员岗位职责
2013/12/09 职场文书
环保公益广告语
2014/03/13 职场文书
科学发展观活动总结
2014/08/28 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
养成教育主题班会
2015/08/13 职场文书
作文之亲情600字
2019/09/23 职场文书