關於django過濾器的使用

最近項目中要作分類篩選,其實已經作了這個功能,可是有一個字段是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

相關文章
相關標籤/搜索