我无法创建一些逻辑(对我来说很有趣)。例如我有这样的视图:
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
?
答案 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库文档中有一些有关各种过滤器类型的摘要。