如何使用 drf-spectaulous 记录具有不同数据类型的元组?

问题描述 投票:0回答:1

我正在使用 drf-spectaulous 生成 Swagger 文档。

我有一个返回字典的视图集(它不通过 drf 序列化器,因为它都是本机对象)。

字典看起来像这样:

data = {
            "lines": List[str],
            "points": List[Tuple[float, float, int, str]]
            "next_failure_date": str,
            "estimate_nth_failure": str
            "status": str,
        }

我找不到 drf-spectaulous 正确记录“点”键的方法,它只给了我一个

"points": ["string"]

我尝试过的:


class SwaggerGrowthChartPoint:
    """Class used to generate the Swagger documentation"""

    def __init__(self, x: float, y: float, sap_id: int, created_on: str):
        self.x = x
        self.y = y
        self.sap_id = sap_id
        self.created_on = created_on

class SwaggerGrowthChartPointField(serializers.Field):

    def to_representation(self, value: SwaggerGrowthChartPoint):
        return f"{value.x}, {value.y}, {value.sap_id}, {value.created_on}"
    
    def to_internal_value(self, data):
        return SwaggerGrowthChartPoint(*data)

class SwaggerGrowthChartSerializer(serializers.Serializer):
    """Serializer used to generate the Swagger documentation"""

    lines = SwaggerGrowthChartLinesSerializer(many=True)
    points = serializers.ListField(child=SwaggerGrowthChartPointField())
    next_failure_date = serializers.ListField(child=serializers.DateField())
    estimate_nth_failure = serializers.DateField()
    status = serializers.CharField()

但运气不佳。

django serialization django-rest-framework django-serializer drf-spectacular
1个回答
0
投票

这似乎部分解决了我的问题:

@extend_schema_field(
    {
        "type": "array",
        "items": {
            "oneOf": [
                {"type": "string"},
                {"type": "integer"},
            ],
        },
        "description": "A time point and its availability state",
        "example": '["00:00", 1]',
    }
)
class TimePointAvailabilityField(serializers.Field):
    pass

class DetailedScheduleItem(serializers.Serializer):
    date = serializers.DateField()
    schedule = serializers.ListField(child=TimePointAvailabilityField())

至少,它生成了正确的 JSON 示例:

  {
    "date": "2023-11-21",
    "schedule": [
      [
        "00:00",
        1
      ]
    ]
  }

如果您只需要示例,则可以完全避免使用字段类型,因为模式具有示例值来生成它就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.