如何在django中基于GET请求中的多个键值对来制作过滤对象的API?

pieyvz9o  于 2022-12-14  发布在  Go
关注(0)|答案(1)|浏览(128)

我urls.py在django项目的“www.example.com“文件夹中有一个API URL:-

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

上面的代码只根据get请求中传递的一个键值对过滤我的Test对象,现在我想过滤一个以上的键值对。
例如:-过滤器应为:姓名=约翰&类型_测试=算法&计数=3
我应该如何在django中设计API端点,同时又不使url太长?我可以通过请求体使用json或map吗?我是django和api开发的初学者,所以任何帮助都将不胜感激。

yjghlzjz

yjghlzjz1#

你可以使用django-filter。
管道安装django过滤器
然后将'django_filters'添加到Django的INSTALLED_APPS:

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/

相关问题