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类型强制转换long to int的代码
Feb 10 Python
Python学习之asyncore模块用法实例教程
Sep 29 Python
Python 2.7.x 和 3.x 版本的重要区别小结
Nov 28 Python
在Python的Django框架中用流响应生成CSV文件的教程
May 02 Python
python web框架学习笔记
May 03 Python
Python手机号码归属地查询代码
May 04 Python
python构建自定义回调函数详解
Jun 20 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
Dec 10 Python
pytorch .detach() .detach_() 和 .data用于切断反向传播的实现
Dec 27 Python
python字典key不能是可以是啥类型
Aug 04 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
Oct 20 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和网页显示乱码解决方法集锦
2008/03/27 PHP
PHP Memcached应用实现代码
2010/02/08 PHP
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
2013/01/06 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
Yii2增删改查之查询 where参数详细介绍
2016/08/08 PHP
PHP编程求最大公约数与最小公倍数的方法示例
2017/05/29 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
JavaScript小技巧 2.5 则
2010/09/12 Javascript
jQuery hover 延时器实现代码
2011/03/12 Javascript
jQuery晃动层特效实现方法
2015/03/09 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
Highcharts学习之坐标轴
2016/08/02 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
基于angular实现模拟微信小程序swiper组件
2017/06/11 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
vue  自定义组件实现通讯录功能
2018/09/30 Javascript
node.js实现为PDF添加水印的示例代码
2018/12/05 Javascript
[33:23]Secret vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
浅谈Django学习migrate和makemigrations的差别
2018/01/18 Python
python+splinter自动刷新抢票功能
2018/09/25 Python
python yield和Generator函数用法详解
2020/02/10 Python
python中提高pip install速度
2020/02/14 Python
Pat McGrath Labs官网:世界上最有影响力的化妆师推出的彩妆品牌
2018/01/07 全球购物
全球最大的户外用品零售商之一:The House
2018/06/12 全球购物
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
酒店服务与管理毕业生求职信
2013/11/02 职场文书
中学生学雷锋活动心得体会
2014/03/10 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
教师三严三实学习心得体会
2014/10/11 职场文书
人与自然的观后感
2015/06/18 职场文书
谁动了我的奶酪读书笔记
2015/06/30 职场文书
2016年领导干部廉政承诺书
2016/03/24 职场文书
2019年鼓励无偿献血倡议书
2019/09/17 职场文书