swagger autoschema(drf_spectacular)为一个路由建设错误,我不能创建独立的这个路由太多

nhjlsmyf  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(54)

我使用drf_spectacular和所有的路线建设正常,除了一个:

@action(detail=False, methods=['GET'])
def unique_cities(self, request):
    """Getting unique cities from DB sports_person."""
    unique_cities = SportsPerson.objects.values_list('city', flat=True)
    return Response({'unique_cities': list(unique_cities)})

当然,作为回答,我有:

{
    "unique_cities": [
        "New-York",  
        "Kyiv",
       "Test"
    ]
}

但在swagger for this route中,我看到了一个类似于我个人的一般路线的模式:

{
    "id": 0,
    "first_name": "string",
    "last_name": "string",
    "birth_day": "2023-09-13",
    "rank": "string",
    "city": "string",
    "team": "string"
}

我理解了从我的CRUD端点的序列化器构建模式,但是对于问题路由,我不需要它们。我试着用比这样的东西:

@extend_schema(
    responses={200: {"unique_cities": [str]}},
    examples={
        "application/json": {
            "unique_cities": ["New-York", "Kyiv", "Test"]
        }
    },
)

但也不管用,我看有两个办法可以解决这个问题:实现正确@extend_schema或从drf_spectacular修复工作autoschema,但我卡住了,找不到解决方案

cmssoen2

cmssoen21#

问题,@detail_route()不再使用,但@action()没有为autoschema打开。路由是如此简单,创建序列化器和其他代码是不感兴趣的,所以我决定在装饰器中创建一个模式。它完全有效

@extend_schema(
    parameters=[
        OpenApiParameter(
            name='team',
            location=OpenApiParameter.QUERY,
            description='route for fast enter name of exists team',
            required=True,
            type=str
        ),
    ],
    responses={
        200: OpenApiTypes.OBJECT,
    },
    examples=[
        OpenApiExample(
            name="Auto complete field for name team with answer",
            # summary="How the company details are returned",
            description="answer for query='jun' ",
            value={
                "auto_complete_teams": ["Junior", "Jungle"],
            },
            response_only=True
        ),
        OpenApiExample(
            name="empty answer",
            summary="Auto complete field for name team without answer",
            description="answer for query='abc' ",
            value={
                "auto_complete_teams": [],
            },
            response_only=True
        )
    ],
)
@action(detail=False, methods=['GET'])
def auto_complete_teams(self, request):
    """Getting relevant teams from search_key"""
    query = request.GET.get('team', '')
    relevant_teams_list = []
    if query:
        relevant_teams = SportsPerson.objects.filter(
            team__icontains=query
        )
        for relevant_team in relevant_teams:
            relevant_teams_list.append(relevant_team.team)
    return Response(
        {'auto_complete_teams': list(set(relevant_teams_list))},
        status=status.HTTP_200_OK
    )
def namefunc():
    """..."""

相关问题