首页 > 解决方案 > Django按序列化方法字段过滤

问题描述

我无法创建一些逻辑(对我来说很有趣)。例如我有这样的视图:

class DucktList(generics.ListAPIView):
serializer_class = DuckSerializer
filter_backends = (DjangoFilterBackend,)
    filter_fields = ('test_field',) // i want to create some custom field and filter by it if needed.

序列化器:

class DuckSerializer(serializers.ModelSerializer):
    test_field = SerializerMethodField() // i want filter by this field! 

    def get_test_field(self, obj):
        return True

class Meta:
    ......

我如何filter_fields过滤test_field

标签: pythondjangoapi

解决方案


也许您可以使用自定义方法定义自己的过滤器并使用此库django-filters

from django_filters import rest_framework as filters

class EventFilter(filters.FilterSet):

    finish_on = filters.BooleanFilter(name='finish_on', method='filter_manifestation')

    begin_on = filters.BooleanFilter(name='begin_on', method='filter_manifestation')

    def filter_manifestation(self, queryset, name, value):
        if value is False:
            lookup = '__'.join([name, 'gte'])
        else:
            lookup = '__'.join([name, 'lte'])
        qs = queryset.filter(**{lookup: timezone.now()})
        return qs

    class Meta:
        model = Event
        fields = [
            'finished', 'has_begun'
        ]

并将此过滤器添加到您的视图中:

class ManifestationViewSet(viewsets.ReadOnlyModelViewSet):
    ...
    filter_class = EventFilter
    ...

然后,您可以根据您想要在序列化程序自定义字段的相关功能中执行的操作来调整过滤器的自定义方法。

您在 django-filter 库文档中有一些关于各种过滤器类型的片段。


推荐阅读