Как отфильтровать запрос с параметрами, разделенными запятыми, в Django (DRF Filtering) - PullRequest
0 голосов
/ 03 июня 2018

Пожалуйста, мой вопрос не продублирован, я уже искал его, но без согласованного результата.Итак, я создаю API-интерфейс restfull с помощью djangorestframework

. Я хочу, чтобы этот запрос типа

http://localhost:8000/api/products/?category_name_fr=shirt,shoes

нашел все продукты, в которых category_name_fr содержит рубашку или обувь

.это после некоторого поиска в Google, я написал собственный класс фильтра django (MultiValueCharFilter), но фильтр на самом деле не ведет себя так, как я хочу.Когда я делаю запрос, как указано выше, он возвращает мне все продукты в ProductTable.Но когда я делаю запрос, как показано ниже, фильтрация выполняется правильно

http://localhost:8000/api/products/?category_name_fr=shirt

Вот исходный код моего файла filters.py, класс продукта - ProductList

    from django_filters import rest_framework as filters
    from .models import  ProductList
    from django_filters import Filter
    from django_filters.fields import Lookup


    class MultiValueCharFilter(filters.BaseCSVFilter, filters.CharFilter):

        def filter(self, qs, value):
            # value is either a list or an 'empty' value
            values = value or []

            print(values)

            for value in values:
                qs = super(MultiValueCharFilter, self).filter(qs, value) | qs
            return qs

class ProductListFilter(filters.FilterSet):
    min_price = filters.NumberFilter(name="price", lookup_expr='gte')
    max_price = filters.NumberFilter(name="price", lookup_expr='lte')
    category_name_fr = MultiValueCharFilter(name="category_name_fr", lookup_expr='icontains')
    category_name_en = MultiValueCharFilter(name="category_name_en", lookup_expr='icontains')
    collection_name_fr = MultiValueCharFilter(name="collection_name_fr", lookup_expr='icontains')
    collection_name_en = MultiValueCharFilter(name="collection_name_en", lookup_expr='icontains')
    name_en = MultiValueCharFilter(name="name_en", lookup_expr='icontains')
    name_fr = MultiValueCharFilter(name="name_fr", lookup_expr='icontains')

    class Meta:
        model = ProductList
        fields = ['sale', 'sold', 'min_price', 'max_price', 'category_name_fr', 'name_en', 'name_fr', 
        'category_name_en', 'collection_name_fr', 'collection_name_en']

Для получения дополнительной информации это код представления ListAPIView

from rest_framework import viewsets, generics, filters as rf_filters
from ..models import Product,  Collection, ProductList
from ..serializers import ProductSerializer, CollectionSerializer, ProductListSerializer
from django_filters import rest_framework as filters
from ..filters import ProductFilter, ProductListFilter
from rest_framework.pagination import PageNumberPagination
from rest_framework.views import APIView
from rest_framework.response import Response


class StandardResultsSetPagination(PageNumberPagination):
    page_size = 4
    page_size_query_param = 'page_size'
    max_page_size = 15

class ProductList(generics.ListAPIView):
    queryset = ProductList.objects.all()
    serializer_class = ProductListSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filter_class = ProductListFilter
    serializer_class = ProductListSerializer
    ordering_fields = ('price', 'created_at')
    pagination_class = StandardResultsSetPagination
...