简体   繁体   English

API如何根据GET请求中的多个键值对过滤django中的对象?

[英]How to make API for filtering objects in django based on multiple key-value pairs in GET request?

I have an API url in "urls.py" folder of my django project:-我的 django 项目的“urls.py”文件夹中有一个 API url:-

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

This works fine for the below code:-这适用于以下代码:-

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})

The above code filters my Test objects based on only a single key value-pair passed in the get request.上面的代码仅根据 get 请求中传递的单个键值对过滤我的 Test 对象。 I now want to filter on a more than 1 key-value pairs.我现在想过滤超过 1 个键值对。

Eg:- Filter should be: name=john&type_test=algo&count=3例如:- 过滤器应为:name=john&type_test=algo&count=3

How should I design the api endpoint in django and not make the url too lengthy as well?我应该如何设计 django 中的 api 端点,而不是让 url 也太长? Can I use a json or map, via request body?我可以通过请求正文使用 json 或 map 吗? I am a beginer to django and api development so any help would be appreciated.我是 django 和 api 开发的初学者,因此我们将不胜感激。

You can use django-filter.你可以使用 django 过滤器。

pip install django-filter pip 安装 django-filter

Then add 'django_filters' to Django's INSTALLED_APPS:然后将 'django_filters' 添加到 Django 的 INSTALLED_APPS:

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

Add the filter backend to your settings将过滤器后端添加到您的设置

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

add the filter backend to an individual View or ViewSet.将过滤器后端添加到单个 View 或 ViewSet。

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']

If all you need is simple equality-based filtering, you can set a filterset_fields attribute on the view, or viewset, listing the set of fields you wish to filter against.如果您只需要简单的基于相等的过滤,您可以在视图或视图集上设置 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/ https://www.django-rest-framework.org/api-guide/filtering/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM