首页 > 解决方案 > 自定义过滤器和 Rest 框架不能同时工作

问题描述

我正在尝试在我的视图类中实现 Django 过滤器。但问题是当我使用filter_classthen filter_fields& 'search_fields' 时不起作用,反之亦然。

我的views.py 代码是:

from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter, SearchFilter

class CustomLoggerAPIView(generics.ListAPIView):
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAuthenticated,permissions.IsAdminUser,)
    serializer_class = serializers.CustomLoggerSerializer
    filter_class = filters.LogsFilter
    queryset = models.CustomLogger.objects.all().order_by('-id')
    filter_backends = (DjangoFilterBackend, SearchFilter,)
    pagination_class = pagination.PostLimitOffsetPagination
    filter_fields = ('user','user_sensor','sensor_type',)
    search_fields = ('message')

和我的 filters.py 类:

class LogsFilter(django_filters.rest_framework.FilterSet):
    start_date = django_filters.DateTimeFilter(field_name='created_at', lookup_expr='gte')
    end_date = django_filters.DateTimeFilter(field_name='created_at', lookup_expr='lte')

    class Meta:
        model = models.CustomLogger
        fields = ('start_date', 'end_date')

我想要两个过滤器。我不确定我在这里做错了什么。任何帮助将不胜感激。提前致谢

标签: django-rest-framework

解决方案


没错,如果您指定 a filterser_class,则filter_fields视图中的 将被忽略。解决方案很简单,只需将它们filter_fields放在fields您的LogsFilterMeta 类中:

class LogsFilter(django_filters.rest_framework.FilterSet):
    start_date = django_filters.DateTimeFilter(field_name='created_at', lookup_expr='gte')
    end_date = django_filters.DateTimeFilter(field_name='created_at', lookup_expr='lte')

    class Meta:
        model = models.CustomLogger
        fields = ('start_date', 'end_date', 'user','user_sensor','sensor_type')

推荐阅读