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)