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 17 Python
Python for Informatics 第11章之正则表达式(四)
Apr 21 Python
kaggle+mnist实现手写字体识别
Jul 26 Python
tensorflow使用神经网络实现mnist分类
Sep 08 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 Python
python 基于TCP协议的套接字编程详解
Jun 29 Python
django和vue实现数据交互的方法
Aug 21 Python
python rsa实现数据加密和解密、签名加密和验签功能
Sep 18 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
Oct 22 Python
python实现图片素描效果
Sep 26 Python
python 实现控制鼠标键盘
Nov 27 Python
Python页面加载的等待方式总结
Feb 28 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
Mysql中分页查询的两个解决方法比较
2013/05/02 PHP
php实现的操作excel类详解
2016/01/15 PHP
JavaScript延迟加载
2021/03/09 Javascript
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
浅谈javascript 面向对象编程
2009/10/28 Javascript
js下写一个事件队列操作函数
2010/07/19 Javascript
jquery 学习之二 属性(html()与html(val))
2010/11/25 Javascript
javascript定义函数的方法
2010/12/06 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
JS版微信6.0分享接口用法分析
2016/10/13 Javascript
input 标签实现输入框带提示文字效果(两种方法)
2017/10/09 Javascript
微信小程序表单验证功能完整实例
2017/12/01 Javascript
使用Bootstrap4 + Vue2实现分页查询的示例代码
2017/12/21 Javascript
webpack源码之loader机制详解
2018/04/06 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
2018/08/24 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
python中管道用法入门实例
2015/06/04 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
Python+appium框架原生代码实现App自动化测试详解
2020/03/06 Python
HTML5图片层叠的实现示例
2020/07/07 HTML / CSS
华为消费者德国官方网站:HUAWEI德国
2020/11/03 全球购物
PHP如何对用户密码进行加密
2014/07/31 面试题
我想声明一个指针并为它分配一些空间, 但却不行。这些代码有什么 问题?char *p; *p = malloc(10);
2016/10/06 面试题
临床医学专业毕业生的自我评价
2013/10/17 职场文书
单位提档介绍信
2014/01/17 职场文书
财务情况说明书范文
2014/05/06 职场文书
优秀教师先进事迹材料
2014/12/15 职场文书
大连导游词
2015/02/12 职场文书
毕业生党员个人总结
2015/02/14 职场文书
个人年终总结怎么写
2015/03/09 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android