Как сделать API для фильтрации объектов в django на основе нескольких пар ключ-значение в GET-запросе?

У меня есть API url в папке "urls.py" моего проекта django :-

path('tests/filter/<str:key1>/<str:value1>', FilterTests.as_view())

Это отлично работает для приведенного ниже кода :-

from rest_framework import generics
from service.models import Test
from service.serializers import TestListSerializer


class FilterTests(generics.ListAPIView):
    queryset = Test.objects.all()
    serializer_class = TestListSerializer

    def get_queryset(self, *args, **kwargs):
        key1 = self.kwargs['key1']
        value1 = self.kwargs['value1']
        return Test.objects.filter(**{key1: value1})

Приведенный выше код фильтрует мои объекты Test на основе только одной пары ключ-значение, переданной в запросе get. Теперь я хочу фильтровать по более чем 1 паре ключ-значение.

Эг:- Фильтр должен быть : name=john&type_test=algo&count=3

Как разработать конечную точку api в django и не сделать url слишком длинным? Могу ли я использовать json или map, через тело запроса? Я новичок в django и разработке api, поэтому любая помощь будет оценена по достоинству.

Вы можете использовать django-filter.

pip install django-filter

Затем добавьте 'django_filters' в INSTALLED_APPS Django:

INSTALLED_APPS = [
    ...
    'django_filters',
    ...
]

Добавьте бэкенд фильтра в настройки

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
}

добавьте бэкэнд фильтра к отдельному представлению или набору представлений.

from django_filters.rest_framework import DjangoFilterBackend

class UserListView(generics.ListAPIView):
    ...
    filter_backends = [DjangoFilterBackend]


class ProductList(generics.ListAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['category', 'in_stock']

Если вам нужна простая фильтрация на основе равенства, вы можете установить атрибут filterset_fields для представления или набора представлений, перечисляя набор полей, по которым вы хотите фильтровать.

This will automatically create a FilterSet class for the given fields, and will allow you to make requests such as

http://example.com/api/products?category=clothing&in_stock=True

https://www.django-rest-framework.org/api-guide/filtering/

Вернуться на верх