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之网站的结构
Oct 24 Python
python使用turtle库绘制时钟
Mar 25 Python
Python中函数参数调用方式分析
Aug 09 Python
Python实现繁?转为简体的方法示例
Dec 18 Python
python实现淘宝秒杀脚本
Jun 23 Python
Python下简易的单例模式详解
Apr 08 Python
Django 全局的static和templates的使用详解
Jul 19 Python
基于MATLAB和Python实现MFCC特征参数提取
Aug 13 Python
django drf框架自带的路由及最简化的视图
Sep 10 Python
python面向对象之类属性和类方法案例分析
Dec 30 Python
Python编程编写完善的命令行工具
Sep 15 Python
python函数的两种嵌套方法使用
Apr 02 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面向对象的方法重载两种版本比较
2008/09/08 PHP
中英文字符串翻转函数
2008/12/09 PHP
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
2014/09/28 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
2015/10/28 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
JavaScript面向对象分层思维全面解析
2016/11/22 Javascript
详解微信小程序开发之下拉刷新 上拉加载
2016/11/24 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
node获取客户端ip功能简单示例
2019/08/24 Javascript
基于canvas实现手写签名(vue)
2020/05/21 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
js回到页面指定位置的三种方式
2020/12/17 Javascript
[19:15]DK战队纪录片
2014/09/02 DOTA
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
Python中使用语句导入模块或包的机制研究
2015/03/30 Python
Python实现基于二叉树存储结构的堆排序算法示例
2017/12/08 Python
python实现学生信息管理系统
2020/04/05 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
pygame实现飞机大战
2020/03/11 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
2020/04/17 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
纯css3实现照片墙效果
2014/12/26 HTML / CSS
用HTML5实现手机摇一摇的功能的教程
2012/10/30 HTML / CSS
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
计算机相关的自我评价
2014/01/15 职场文书
奥运会口号
2014/06/13 职场文书
植物生产学专业求职信
2014/08/08 职场文书
书法社团活动总结
2015/05/07 职场文书
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python
Minikube搭建Kubernetes集群
2022/03/31 Servers
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python