python Django 4 REST框架JSON POST请求过滤器

3qpi33ja  于 2023-01-04  发布在  Python
关注(0)|答案(1)|浏览(113)

我有一个API,我需要过滤一些数据。我的用户会传递一个JSON,其中包含几个示例,我需要返回给他们,如果有或没有在我的数据库中。但我不知道如何让Django4在同一个JSON中发出几个POST请求(我猜由于他们只会获取信息,这将是几个“GET”请求,但是我需要在一个帖子里做)。我该怎么做呢?我甚至不知道怎么开始。
例如,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

这是我的媒体模型:

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

rkue9o1l1#

经过一番努力,我终于找到了一个解决办法,我的想法如下:
我创建了另一个名为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)

相关问题