最近項目中要作分類篩選,其實已經作了這個功能,可是有一個字段是MultiSelectField類型,包含多個值,用戶提交的數據是單個值,沒法查詢出結果,python
因此用到了自定義過濾django
原代碼.net
class InvestmentAgencyViewSet(viewsets.ModelViewSet): """ Viewset for investcase model """ queryset = InvestmentAgency.objects.is_public() serializer_class = InvestmentAgencySerializer permission_classes = ( permissions.DjangoModelPermissions, ) filter_backends = (filters.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter,) filter_fields = ('id', 'name', 'sector_type', 'investment_stage', 'country') search_fields = ('name', ) ordering_fields = ('name', 'founded_time') def list(self, request, *args, **kwargs): """ add country data """ queryset = self.filter_queryset(self.get_queryset()) page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) res = add_country_in_list(serializer.data) return self.get_paginated_response(res) serializer = self.get_serializer(queryset, many=True) res = add_country_in_list(serializer.data) return Response(res)
自定義過濾器後代碼rest
#自定義的過濾器類,繼承django_filters.rest_framework.FilterSet class InvestFilter(django_filters.rest_framework.FilterSet): sector_type =django_filters.CharFilter(lookup_expr='icontains') class Meta: model = InvestmentAgency fields = ['id', 'name', 'sector_type', 'investment_stage', 'country']
class InvestmentAgencyViewSet(viewsets.ModelViewSet): """ Viewset for investcase model """ queryset = InvestmentAgency.objects.is_public() serializer_class = InvestmentAgencySerializer permission_classes = ( permissions.DjangoModelPermissions, ) filter_backends = (filters.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter,) filter_fields = ('id', 'name', 'sector_type', 'investment_stage', 'country') search_fields = ('name', ) ordering_fields = ('name', 'founded_time') filter_class = InvestFilter def list(self, request, *args, **kwargs): """ add country data """ queryset = self.filter_queryset(self.get_queryset()) page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) res = add_country_in_list(serializer.data) return self.get_paginated_response(res) serializer = self.get_serializer(queryset, many=True) res = add_country_in_list(serializer.data) return Response(res)
其他django-filter使用參考blog
https://www.jianshu.com/p/6dd900d38035繼承
https://blog.csdn.net/kuangshp128/article/details/78876254get