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处理json字符串转化为字典的简单实现
Jul 07 Python
Python命令行解析模块详解
Feb 01 Python
python抽取指定url页面的title方法
May 11 Python
python实现烟花小程序
Jan 30 Python
浅析Python数字类型和字符串类型的内置方法
Dec 22 Python
tensorflow之并行读入数据详解
Feb 05 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
Mar 04 Python
通过python 执行 nohup 不生效的解决
Apr 16 Python
Python OrderedDict字典排序方法详解
May 21 Python
Python爬虫使用bs4方法实现数据解析
Aug 25 Python
Python列表推导式实现代码实例
Sep 09 Python
Python经典五人分鱼实例讲解
Jan 04 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.ini中文版(1)
2006/10/09 PHP
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
thinkPHP线上自动加载异常与修复方法实例分析
2016/12/01 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
jquery ajax abort()的使用方法
2010/10/28 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
input链接页面、打开新网页等等的具体实现
2013/12/30 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
JS实现的自定义右键菜单实例二则
2015/09/01 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
2016/12/01 Javascript
bootstrap中的 form表单属性role="form"的作用详解
2017/01/20 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
AngularJS service之select下拉菜单效果
2017/07/28 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
JavaScript中的连续赋值问题实例分析
2019/07/12 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
2019/11/18 Javascript
JS script脚本中async和defer区别详解
2020/06/24 Javascript
Python创建xml文件示例
2017/03/22 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
2019/04/06 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
2019/06/19 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
Python如何实现动态数组
2019/11/02 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
2020/05/25 Python
Halston Heritage官网:简洁的日装,稍显奢华的晚装
2018/11/20 全球购物
KTV的创业计划书范文
2014/02/02 职场文书
《她是我的朋友》教学反思
2014/04/26 职场文书
会员卡清退活动总结
2014/08/27 职场文书
投标邀请书范本
2015/02/02 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电