Как показать тело запроса с помощью django rest framework и drf_spectacular в представлениях на основе функций
У меня следующая проблема: мне трудно найти документацию по представлениям на основе функций, чтобы документировать их с помощью drf_spectacular
, поскольку все это можно найти для представлений на основе классов
Я пробовал разные способы документировать requestBody
в swagger, используя serializers_class
, ручные объекты, inline_serializers
, но все это безуспешно, здесь я оставляю фрагмент моего кода и скриншот как это должно быть и где я должен быть
@extend_schema(
summary="Fetch order information",
description="This endpoint filter orders based on the provided parameters.",
tags=["orders"],
request=OrderInfoParamsSerializer, # HERE IS MY PROBLEM
responses={
200: OrderInfoSerializer(many=True),
},
)
@extend_schema(request=None)
@api_view(["GET"])
@token_required
def order_info(request: Request) -> Response:
params = OrderInfoParamsSerializer(data=request.data)
if not params.is_valid():
return Response({"error": params.errors}, status=status.HTTP_400_BAD_REQUEST)
params = params.validated_data
...
class OrderInfoParamsSerializer(serializers.Serializer):
order_id = serializers.IntegerField(
required=False, allow_null=True, help_text="Filter by order ID"
)
class OrderInfoSerializer(serializers.ModelSerializer):
class Meta:
model = Orders
fields = "__all__"
Я попытался перенести представления на те, которые основаны на классах, но это сработало только с одним из них в методе POST, а не GET (я мог бы перенести все свои представления, если бы это сработало)
Я не хочу заниматься рефакторингом всего проекта и хотел бы найти решение, которое работает для представлений, основанных на функциях.
Просто прикрепляем @extend_schema
, как и в случае с обычными представлениями, основанными на классах.
@extend_schema(request=OrderInfoParamsSerializer)
DRF Spectacular не делает ничего другого с представлениями, основанными на функциях. Декоратор @extend_schema
ведет себя одинаково в обоих случаях.
По-видимому, поскольку метод GET не имеет тела запроса в соответствии со стандартом HTTP, drf-spectacular
не распознает его.
Только небезопасные методы могут иметь requestBody
.
https://github.com/tfranzel/drf-spectacular/issues/809
Тело запроса, применимое для данной операции. RequestBody полностью поддерживается в методах HTTP, где спецификация HTTP 1.1 RFC7231 явно определяет семантику для тел запросов. В других случаях, когда спецификация HTTP нечеткая (например, GET, HEAD и DELETE), requestBody разрешен, но не имеет четко определенной семантики, и по возможности его следует избегать.