Как исключить параметр пути id в swagger-ui в DRF-YASG для DRF и DJANGO
Я использую DRF-YASG для документирования API в Swagger и хочу настроить / исключить некоторые поля, показанные в параметрах
Я работаю над проектом с Django 2.1.7, DRF 3.9.2 и DRF-YASG 1.14.0.
Итак, я хочу исключить идентификатор, который показан в swagger-ui (например, 'string' и 'path'), потому что он у меня есть в запросе тела через Schema, но swagger-ui показывает id (автоматически сгенерированное поле) в параметрах.
На экране ниже вы можете увидеть проблему:
https://user-images.githubusercontent.com/5421182/54859641-70359d00-4cee-11e9-9b12-79ab57d12495.png
Вот мой код...
request_category_put = openapi.Schema(type=openapi.TYPE_OBJECT, required=['id','name'],
properties={
'id': openapi.Schema(type=openapi.TYPE_INTEGER,
title='Id', readOnly=True,
description='Id of the category'), ### <-- I have the ID here.
'name': openapi.Schema(type=openapi.TYPE_STRING,
title='Category', maxLength=200, minLength=1,
description='Name of the category')
},
example={
'id' : 1,
'name' : 'Business',
}
)
class CategoryDetail(APIView):
permission_classes = (IsAuthenticatedOrReadOnly,)
@swagger_auto_schema(
manual_parameters=[authorization],
request_body=request_category_put,
responses = {
'200' : response_category,
'400': 'Bad Request',
'404': 'Not found'
},
security=[security_endpoint],
operation_id='Update category',
operation_description='Update a specific category.',
)
def put(self, request, pk, format=None):
category = get_object_or_404(Category, pk=pk)
serializer = CategorySerializer(category, data=request.data)
if serializer.is_valid():
serializer.save(modified_by=self.request.user)
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Когда я добавляю поле в manual_parameters
в @swagger_auto_schema
, только измените атрибуты этого... но поле все еще там.
2 ответа
Глядя на код, как manual_parameters
реализовано, это не выглядит возможным. Видеть:
drf_yasg.inspectors.view.get_operation()
def get_operation(self, operation_keys=None):
operation_keys = operation_keys or self.operation_keys
consumes = self.get_consumes()
produces = self.get_produces()
body = self.get_request_body_parameters(consumes)
query = self.get_query_parameters()
parameters = body + query
parameters = filter_none(parameters)
parameters = self.add_manual_parameters(parameters)
в этой функции есть вызов add_manual_parameters()
который только добавляет указанные вами переопределения в существующий список параметров. Таким образом, вам нужно будет добавить возможность либо заменить существующие параметры, либо добавить новый manual_overrides_remove, который удалит определенные параметры. Я бы предложил поднять проблему на страницах github drf_yasg или отправить PR, чтобы добавить эту функцию.
Попробуйте добавить имя вашего параметра, который вы хотите исключить из описания запроса swagger в мета-поле сериализатора
read_only_fields
Вроде как
class SomeSerializer(ModelSerializer):
...
class Meta:
...
read_only_fields = ["id", ...]