代码之家  ›  专栏  ›  技术社区  ›  blueFast

创建自定义筛选器

  •  2
  • blueFast  · 技术社区  · 7 年前

    目前我的看法如下:

    from rest_framework.permissions import AllowAny
    from dynamic_rest.viewsets import DynamicModelViewSet
    from django_filters.rest_framework import DjangoFilterBackend
    
    from .models import Purchase
    from .serializers import PurchaseSerializer
    
    
    class PurchasesViewSet(DynamicModelViewSet):
        queryset = Purchase.objects.all()
        serializer_class = PurchaseSerializer
        permission_classes = (AllowAny,)
        filter_backends = (DjangoFilterBackend,)
        filter_fields = ('name', 'color')
    

    这样我就可以通过精确的 name 和 color .

    date DateField 类型)。我想按“季度”创建一个自定义筛选器,以便此类请求:

    /purchases/?quarter=2018Q1
    

    提供具有 指定季度的字段。请注意 quarter 不是模型字段。

    创建这样一个自定义过滤器的方法是什么?

    2 回复  |  直到 7 年前
        1
  •  2
  •   JPG    7 年前

    首先,你必须创造 自定义筛选器 随着 筛选器类

    import django_filters
    from rest_framework.exceptions import ValidationError
    
    
    class QuarterFilter(django_filters.Filter): # Custom Filter
        def get_quarter_range(self, quarter):
            if quarter == 1:
                return [1, 3]
            elif quarter == 2:
                return [4, 6]
            elif quarter == 3:
                return [7, 9]
            elif quarter == 4:
                return [10, 12]
            else:
                raise ValidationError("quarter value must be range from 1-4")
    
        def filter(self, qs, value):
            """
            create your custom filtering logi here
            """
            # here the "value" will be the value parsed from URL params, ie "2018Q1"
            try:
                year, quarter = value.split("Q") # spliting the input to get year and quarter value
                qs = qs.filter(date__year=year)
    
                qs = qs.filter(date__month__range=self.get_quarter_range(quarter))
                return qs
            except:
                return qs
    
    
    class PurchaseFilter(django_filters.FilterSet): # Custom Filter Class
        quarter = QuarterFilter()
    
        class Meta:
            model = Purchase
            fields = ['name', 'color', 'quarter']



    然后,在你的课堂上提到它 filterset_class 属性。那么你的观点是,

    class PurchasesViewSet(DynamicModelViewSet):
        queryset = Purchase.objects.all()
        serializer_class = PurchaseSerializer
        permission_classes = (AllowAny,)
        filter_backends = (DjangoFilterBackend,)
        # filter_fields = ('name', 'color') ---- Remove this line of code
        filterset_class = PurchaseFilter



    注意
    我不确定这条线,

    qs = qs.filter(date__month__range=self.get_quarter_range(quarter))
    

    但是,在这种特殊情况下,您需要这样做过滤。

    希望这有帮助!!

        2
  •  2
  •   Ngoc Pham    7 年前

    您可以在filter\u类中创建自定义筛选器

    from rest_framework import filters
    
    class CustomFilter(django_filters.rest_framework.FilterSet):
        class Meta:
            model = Purchase
            fields = ['name', 'color', 'quarter']
        quarter = QuarterFilter(name="quarter")
    
    class QuarterFilter(django_filters.Filter):
        def filter(self, qs, value):
            # create custom in this with value
            return qs.filter(name=value)
    
    class PurchasesViewSet(DynamicModelViewSet):
        queryset = Purchase.objects.all()
        serializer_class = PurchaseSerializer
        permission_classes = (AllowAny,)
        filter_backends = (DjangoFilterBackend,)
        filter_class = CustomFilter
    
    推荐文章