Django-rest-framework中过滤器的定制实例
1、定义一个自定义的filter.py模块,增加一个新的过滤类
importdjango_filters #这个Q可以支持表查询,单下划线获取表字段,双下划线获取关联表, fromdjango.db.modelsimportQ #引入自己的模型 fromapp.item.modelsimportItemCategory #自定义的过滤类,需要继承django_filter.rest_framework中的FilterSet类 classItemCategoryFilter(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控制查询字段 defcategory_filter(self,queryset,name,value): #这里用到多级联表查询 returnqueryset.filter(Q(category_id=value)|Q(category__parent_id=value)|Q(category__parent__parent_id=value)|Q(category__parent__parent__parent_id=value)) classMeta: model=ItemCategory fields=[]
2、将视图处理类中的,过滤器后端重新指定,将过滤器类连接到我们自定义实现的处理类上
classItemsListByCategory(generics.ListCreateAPIView): ''' 根据category编号获取相关模型no。 请求中请带有参数category @:requireparam:category suchas:GET/itemsListByCategory/?Filter_category=2 ''' fromdjango_filters.rest_frameworkimportDjangoFilterBackend fromapp.item.filtersimportItemCategoryFilter queryset=ItemCategory.objects.all() serializer_class=ItemCategorySerializer pagination_class=CommonPagination #在这里哦 filter_backends=(DjangoFilterBackend,) filter_class=ItemCategoryFilter permission_classes=(ReadOnly,)
补充知识:Djangorestfulframework中的filter自定义过滤
classAlertFilter(django_filters.rest_framework.FilterSet): ....... to_bearer_service=django_filters.rest_framework.CharFilter(method='to_bearer_service_filter',label='bearer_service') classMeta: model=Alert fields=[......,'to_bearer_service'] @staticmethod#如果想获取请求信息可以去掉这个静态方法的装饰器,为什么要加静态方法装饰器我也不清楚 defto_bearer_service_filter(queryset,name,value): Q_id=Q() foriinvalue.split(","): ifi=="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) returnqueryset defto_bearer_service_filter(self,queryset,name,value): Q_id=Q() foriinvalue.split(","): ifi=="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) returnqueryset
以上这篇Django-rest-framework中过滤器的定制实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。