返回
PolymorphicProxySerializer 中 oneOf 值的详解指南:如何为多态响应生成准确的 OpenAPI 模式?
python
2024-03-17 00:42:45
DRF PolymorphicProxySerializer 中的 oneOf 值:深入解析
概述
在使用 Django REST Framework(DRF)的 Spectacular 插件生成 OpenAPI 模式时,PolymorphicProxySerializer 可以为多态响应创建复杂的模式。然而,在处理根据不同状态返回不同响应的视图时,生成正确的 oneOf 值至关重要。
问题
当使用 PolymorphicProxySerializer 为端点定义模式时,我们面临一个问题,生成的模式中 oneOf 字段为空。这表明 DRF 无法识别用于表示不同响应类型的内联序列化程序。
解决方案
要解决此问题,我们需要指定 resource_type_mapping
参数。该参数将内联序列化程序名称与其关联的资源类型映射起来。通过提供此映射,DRF 现在可以将内联序列化程序添加到 oneOf 字段中。
修改后的代码如下:
device_service_get_schema = extend_schema_view(
get=extend_schema(
responses={
200: PolymorphicProxySerializer(
resource_type_field_name="timestamp",
serializers=[
inline_serializer(
name="DeviceServiceFailurePayload",
fields={
"timestamp": OpenApiTypes.NONE,
"message": OpenApiTypes.STR,
},
),
inline_serializer(
name="DeviceServiceSuccessPayload",
fields={
"timestamp": OpenApiTypes.DATETIME,
"devices": OpenApiTypes.OBJECT,
},
),
],
resource_type_mapping={
"DeviceServiceFailurePayload": "failure",
"DeviceServiceSuccessPayload": "success",
},
)
},
)
)
生成模式
添加 resource_type_mapping
后,生成的模式将正确包含 oneOf 值:
MetaDeviceService:
oneOf:
- $ref: '#/components/schemas/DeviceServiceFailurePayload'
- $ref: '#/components/schemas/DeviceServiceSuccessPayload'
discriminator:
propertyName: timestamp
mapping:
failure: DeviceServiceFailurePayload
success: DeviceServiceSuccessPayload
结论
通过使用 resource_type_mapping
参数,我们能够在 DRF PolymorphicProxySerializer 中正确生成 oneOf 值。这确保了 OpenAPI 模式准确地反映了视图的响应结构。
常见问题解答
- 什么是 oneOf 值?
oneOf 值是在 OpenAPI 模式中表示多态响应的不同选项。 - 为什么 resource_type_mapping 很重要?
resource_type_mapping
将内联序列化程序名称与其关联的资源类型映射起来,以便 DRF 可以正确识别它们。 - 如何使用 resource_type_mapping?
在 PolymorphicProxySerializer 中指定resource_type_mapping
参数,其中包含内联序列化程序名称与其资源类型之间的映射。 - oneOf 值对 OpenAPI 模式有什么好处?
oneOf 值为客户端提供不同响应选项的清晰视图,从而提高 API 可用性。 - 我可以自定义 oneOf 值的名称吗?
不可以,oneOf 值的名称是由 DRF 根据resource_type_field_name
自动生成的。