Как получить фильтр много-много полей в django rest-framework? - PullRequest
1 голос
/ 01 октября 2019

Я хочу отфильтровать свои данные как localhost:8000/api/1/deliveries/report/?user=1,2 Поле "многие ко многим", а не только одно поле, которое я пытаюсь сделать, но я не могу помочь мне

Вот Views.py

class ReportView(generics.ListCreateAPIView):
    queryset = Delivery.objects.all()
    serializer_class = serializers.DeliverySerializer

    filter_backends = [DjangoFilterBackend]

    filter_fields = {
        'too': ['lte'],
        'fromm': ['gte'],
        'electric_bike': ['exact'],
        'mode': ['exact'],
        'user': ['exact'],

    }

А вот Serializer.py

class ReportSerializer(serializers.ModelSerializer):
    class Meta:
        model = Delivery
        fields = '__all__'

Я получаю только один пользовательский фильтр http://localhost:8000/api/1/deliveries/report/?user=1 как этот

1 Ответ

0 голосов
/ 01 октября 2019

Это объясняется в документации по django-фильтрам :

Это базовый класс, используемый для создания фильтров поиска IN. Ожидается, что этот класс фильтра используется вместе с другим классом фильтра, так как этот класс только проверяет, что входящее значение разделено запятыми. Вторичный фильтр затем используется для проверки отдельных значений.

Таким образом, вы должны определить класс фильтра:

# filters.py

class NumberInFilter(BaseInFilter, NumberFilter):
    pass

class ReportFilter(FilterSet):
    user = NumberInFilter(field_name='user', lookup_expr='in')

    class Meta:
        model = Delivery
        # You should put here your existing filters
        fields = {
            'too': ['lte'],
            'fromm': ['gte'],
            'electric_bike': ['exact'],
            'mode': ['exact'],
        }

И затем использовать его в своем наборе представлений:

# views.py

class ReportView(generics.ListCreateAPIView):
    queryset = Delivery.objects.all()
    serializer_class = serializers.DeliverySerializer

    filter_backends = [DjangoFilterBackend]
    filterset_class = ReportFilter

Класс фильтра более гибок, поскольку вы можете реализовать более продвинутую логику и поведение.

...