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中使用hashlib模块处理算法的教程
Apr 28 Python
从源码解析Python的Flask框架中request对象的用法
Jun 02 Python
使用Python实现博客上进行自动翻页
Aug 23 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
Sep 08 Python
python学习教程之Numpy和Pandas的使用
Sep 11 Python
Django使用详解:ORM 的反向查找(related_name)
May 30 Python
python中字符串的操作方法大全
Jun 03 Python
python实现自动网页截图并裁剪图片
Jul 30 Python
分享Python切分字符串的一个不错方法
Dec 14 Python
python实现图片彩色转化为素描
Jan 15 Python
浅析python表达式4+0.5值的数据类型
Feb 26 Python
python 绘制正态曲线的示例
Sep 24 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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
PHP生成sitemap.xml地图函数
2013/11/13 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
innerHTML,outerHTML,innerText,outerText的用法及区别解析
2013/12/16 Javascript
js处理php输出时间戳对不上号的解决方法
2014/06/20 Javascript
项目中常用的JS方法整理
2015/01/30 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
vue-axios使用详解
2017/05/10 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
2017/07/16 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
2019/07/29 Javascript
vue.js中ref和$refs的使用及示例讲解
2019/08/14 Javascript
JavaScript实现随机点名程序
2020/03/25 Javascript
[02:59]DOTA2完美大师赛主赛事第三日精彩集锦
2017/11/25 DOTA
从零学Python之引用和类属性的初步理解
2014/05/15 Python
Python显示进度条的方法
2014/09/20 Python
Python计算回文数的方法
2015/03/11 Python
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
Python自定义函数计算给定日期是该年第几天的方法示例
2019/05/30 Python
我就是这样学习Python中的列表
2019/06/02 Python
pytorch 改变tensor尺寸的实现
2020/01/03 Python
python golang中grpc 使用示例代码详解
2020/06/03 Python
python 绘制国旗的示例
2020/09/27 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
初中作文评语大全
2014/04/23 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
合作与交流自我评价
2015/03/09 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
nginx对http请求处理的各个阶段详析
2021/03/31 Servers
Python极值整数的边界探讨分析
2021/09/15 Python