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的Django框架中的项目进行单元测试的方法
Apr 11 Python
python 异常处理总结
Oct 18 Python
用Python将动态GIF图片倒放播放的方法
Nov 02 Python
利用Anaconda简单安装scrapy框架的方法
Jun 13 Python
python 字典操作提取key,value的方法
Jun 26 Python
Python OpenCV之图片缩放的实现(cv2.resize)
Jun 28 Python
Python调用C语言的实现
Jul 26 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
Sep 20 Python
给Python学习者的文件读写指南(含基础与进阶)
Jan 29 Python
keras 自定义loss层+接受输入实例
Jun 28 Python
python中逻辑与或(and、or)和按位与或异或(&、|、^)区别
Aug 05 Python
Python字典取键、值对的方法步骤
Sep 30 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 session处理的定制
2009/03/16 PHP
PHP数学运算与数据处理实例分析
2016/04/01 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
微信第三方登录(原生)demo【必看篇】
2017/05/26 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
广告显示判断
2006/08/31 Javascript
在Javascript中为String对象添加trim,ltrim,rtrim方法
2006/09/22 Javascript
Jquery选中或取消radio示例
2013/09/29 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
JQuery遍历DOM节点的方法
2015/06/11 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
详解使用路由延迟加载 Angular 模块
2017/10/12 Javascript
完美解决axios在ie下的兼容性问题
2018/03/05 Javascript
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
2019/09/17 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
vuex的使用步骤
2021/01/06 Vue.js
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
2014/11/19 Python
详解Python中的from..import绝对导入语句
2016/06/21 Python
Python中列表list以及list与数组array的相互转换实现方法
2017/09/22 Python
python实现外卖信息管理系统
2018/01/11 Python
Python使用pickle模块储存对象操作示例
2018/08/15 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
2019/07/07 Python
python中p-value的实现方式
2019/12/16 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
2020/02/27 Python
详解Pandas 处理缺失值指令大全
2020/07/30 Python
应聘护士自荐信
2013/10/21 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
告知书格式
2015/07/01 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
灵能百分百第三季什么时候来?
2022/03/15 日漫
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js