Как сделать 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