簡體   English   中英

API如何根據GET請求中的多個鍵值對過濾django中的對象?

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

我的 django 項目的“urls.py”文件夾中有一個 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 對象。 我現在想過濾超過 1 個鍵值對。

例如:- 過濾器應為:name=john&type_test=algo&count=3

我應該如何設計 django 中的 api 端點,而不是讓 url 也太長? 我可以通過請求正文使用 json 或 map 嗎? 我是 django 和 api 開發的初學者,因此我們將不勝感激。

你可以使用 django 過濾器。

pip 安裝 django-filter

然后將 'django_filters' 添加到 Django 的 INSTALLED_APPS:

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

將過濾器后端添加到您的設置

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

將過濾器后端添加到單個 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']

如果您只需要簡單的基於相等的過濾,您可以在視圖或視圖集上設置 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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM