drf-spectacular 的 extend_schema 不起作用

问题描述

我最近在我的项目中从 drf-yasg 迁移到 drf-spectacular,但 @extend_schema 装饰器似乎没有向我生成的架构添加任何信息:

  • views.py
class SearchView(GenericViewSet):
    serializer_class = serializers.CriterionSerializer
    
    
    @extend_schema(
        methods=['post'],summary="Find patients according to search query.",description="Search for patients related to Documents found with the given query.",request=polymorphicProxySerializer(
            component_name='Criterion',serializers=[
                    serializers.TextCriterionSerializer,serializers.GroupCriterionSerializer,],resource_type_field_name='type',)
    )
    @action(detail=False,methods=['POST'])
    def fetch(self,request):
        serializer = serializers.CriterionSerializer(data=request.data)
        if not serializer.is_valid(raise_exception=True):
            return Response(serializer.errors,status=400)
        
        return serializers.PatientDocumentSerializer(
            serializer.create(serializer.validated_data).fetch(),context={'request': request},many=True
        ).data

这是生成的模式的相关部分:

 /search/fetch/:
    post:
      operationId: searchFetchCreate
      description: ''
      tags:
      - search
      security:
      - jwtAuth: []
      responses:
        '200':
          description: No response body

这里有一些额外的上下文信息:

  • urls.py
router = routers.DefaultRouter()
router.register(r'search',views.SearchView,basename='search')

urlpatterns = [
    path('',include(router.urls),name="search"),]
  • SPECTUAculaR_SETTINGS
SPECTAculaR_SETTINGS = {
    'TITLE': 'API','VERSION': '1.0.0','CAMELIZE_NAMES': True,'COMPONENT_SPLIT_REQUEST': True,'SERVE_PERMISSIONS': ['rest_framework.permissions.AllowAny'],'SWAGGER_UI_SETTINGS': {
        'deepLinking': True,'filter': True,'displayRequestDuration': True,'SyntaxHighlight.activate': True,'SyntaxHighlight.theme': 'monokai',},}
  • 版本:
$ pip3 show django drf-spectacular
Name: Django
Version: 2.2.13
[...]
---
Name: drf-spectacular
Version: 0.17.1
[...]

解决方法

这是由于 methods=['post'], 而不是 methods=['POST'], 内的 @extend_schema