Django 4 REST framework Фильтр запросов JSON POST

У меня есть API, где мне нужно фильтровать некоторые данные. Мой пользователь передает JSON, содержащий несколько экземпляров, которые я должен вернуть ему, если они существуют или нет в моей базе данных. Но я не знаю, как я могу заставить Django 4 сделать несколько POST-запросов в одном JSON (я думаю, поскольку они будут только получать информацию, это будет несколько "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

Это моя медиа-модель:

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)
Вернуться на верх