我正在尝试在我的视图类中实现Django过滤器。但问题是当我使用filter_class
时,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')
我想要两个过滤器。我不确定我在这里做错了什么。任何帮助将不胜感激。提前致谢
没错,如果指定filterser_class
,则视图中的filter_fields
将被忽略。解决方案很简单,只需将这些filter_fields
放在LogsFilter
Meta 类的fields
中即可:
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')