Фильтр Django по полю метода сериализатора - PullRequest
0 голосов
/ 07 мая 2019

Не могу создать какую-то логику (для меня это интересно). Например, у меня есть View как это:

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 голосов
/ 07 мая 2019

Возможно, вы могли бы определить свой собственный фильтр с помощью пользовательских методов и использовать эту библиотеку 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 о различных типах фильтров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...