簡體   English   中英

Django 4 REST 框架 JSON POST 請求過濾器

[英]Django 4 REST framework JSON POST request filter

我有這個 API,我需要在其中過濾一些數據。 我的用戶將傳遞一個包含多個實例的 JSON,如果我的數據庫中存在或不存在,我需要返回給他們。 但我不知道如何使 Django 4 在同一個 JSON 中發出多個 POST 請求(我想因為他們只會獲取信息,所以這將是幾個“GET”請求,但我需要在 POST 中發出它們)。 關於我應該怎么做的想法? 我什至不知道如何開始。

例如,POST 請求可以是:


[
    {
        "name": "media1"
    },
    {
        "name": "media2"
    },
    {
        "name": "media3"
    }
]

如果我有媒體 1 和 3 但沒有媒體 2,則 API 將返回以下內容:

[
    {
        "id": 0,
        "name": "media1"
    },
    {
        None
    },
    {
        "id": 1,
        "name": "media3"
    }
]

這是我目前的觀點。 我實現了一個過濾器,一次只適用於一個 GET 請求:

class MediasViewSet(viewsets.ModelViewSet):
    queryset = Media.objects.all().order_by('name')
    serializer_class = MediaSerializer
    authentication_classes = [JWTAuthentication]
    permission_classes = [IsAuthenticated]
        
    def get_queryset(self, *args, **kwargs):
        print(self.request)
        queryset = super().get_queryset()
        if(self.request.data.__contains__("name")):
            query = self.request.data['name']
        
            if query:
                queryset = Media.objects.filter(name=query)

        return queryset

這是我的媒體 model:

class Media(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=45)

    def __str__(self):
        return self.name

還有我的序列化程序:

class MediaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Mediafields = ['id', 'name', 'processed_status']

經過一番掙扎,我設法找到了解決辦法。 這是我所做的:

我創建了另一個名為 CheckMediasAPIView 的視圖並導入了 CreateAPIView,這樣我就可以重寫 post 方法。 然后,我使用了reduce方法,對每個名稱使用OR邏輯運算符和過濾器。 這是結果:

class CheckMediasAPIView(CreateAPIView):

    def post(self, request, *args, **kwargs):
        q = request.data["list"]
        query = reduce(operator.or_, (Q(name__contains = item["name"]) for item in q))
        result = Media.objects.filter(query).values()
        return Response(result)

暫無
暫無

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

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