Django通过序列化器方法字段过滤

时间:2019-05-07 08:59:36

标签: python django api

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

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

1 个答案:

答案 0 :(得分:0)

也许您可以使用自定义方法并使用此库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库文档中有一些有关各种过滤器类型的摘要。