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 相关文章推荐
Python3访问并下载网页内容的方法
Jul 28 Python
Python中定时任务框架APScheduler的快速入门指南
Jul 06 Python
Python+Django搭建自己的blog网站
Mar 13 Python
Python 解决中文写入Excel时抛异常的问题
May 03 Python
使用Python AIML搭建聊天机器人的方法示例
Jul 09 Python
Python OpenCV 使用滑动条来调整函数参数的方法
Jul 08 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
Jul 19 Python
Python pandas实现excel工作表合并功能详解
Aug 29 Python
Django框架创建项目的方法入门教程
Nov 04 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
Feb 09 Python
Python通过2种方法输出带颜色字体
Mar 02 Python
python基础学习之递归函数知识总结
May 26 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过滤★等特殊符号的正则
2014/01/27 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
PHP简单实现防止SQL注入的方法
2018/03/13 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
PHP Swoole异步读取、写入文件操作示例
2019/10/24 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
json属性名为什么要双引号(个人猜测)
2014/07/31 Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
2014/09/04 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
常用原生js自定义函数总结
2016/11/20 Javascript
浅析JavaScript中break、continue和return的区别
2016/11/30 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
想用好React的你必须要知道的一些事情
2017/07/24 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
vue单页缓存存在的问题及解决方案(小结)
2018/09/25 Javascript
关于React动态加载路由处理的相关问题
2019/01/07 Javascript
layUI实现前端分页和后端分页
2019/07/27 Javascript
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
一些Centos Python 生产环境的部署命令(推荐)
2018/05/07 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
Django错误:TypeError at / 'bool' object is not callable解决
2019/08/16 Python
python 利用turtle库绘制笑脸和哭脸的例子
2019/11/23 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
CSS3弹性盒模型开发笔记(二)
2016/04/26 HTML / CSS
麦当劳印度网上订餐:McDelivery
2020/03/16 全球购物
超市端午节活动方案
2014/01/23 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
js前端面试常见浏览器缓存强缓存及协商缓存实例
2022/06/21 Javascript