DRF Swagger UI中POST请求体JSONField内部数组结构无法显示问题
解决方案
方案1:嵌套序列化器显式声明结构(通用兼容)
如果你的create_array字段存储的结构固定,优先使用该方案,既可以让Swagger自动识别生成目标结构,还能自动完成参数格式校验:
# serializers.py from rest_framework import serializers from .models import Sample # 定义create_array内部单条元素的结构 class CreateArrayItemSerializer(serializers.Serializer): name = serializers.CharField() id = serializers.CharField() class SampleSerializer(serializers.ModelSerializer): # 显式声明create_array为上述结构的数组 create_array = CreateArrayItemSerializer(many=True) class Meta: model = Sample fields = ('ApiUser','ApiKey','create_array','UserName','IPAddress') # 嵌套结构会自动解析为Python列表字典格式,可直接存入JSONField,无需额外转换 def create(self, validated_data): return super().create(validated_data) def update(self, instance, validated_data): return super().update(instance, validated_data)
该方案无需修改模型层的JSONField定义,重启服务后Swagger会自动生成你预期的请求体结构。
方案2:通过Schema注解指定展示效果(无需修改原有序列化逻辑)
如果你不想调整原有序列化器的读写逻辑,仅需要修改Swagger的展示示例,可以根据你使用的Swagger扩展库选择对应配置:
适配drf-yasg
在序列化器中显式给create_array字段指定Swagger schema:
class SampleSerializer(serializers.ModelSerializer): create_array = serializers.JSONField( swagger_schema_fields={ "type": "array", "items": { "type": "object", "properties": { "name": {"type": "string"}, "id": {"type": "string"} } }, "example": [{"name": "string", "id": "string"}] } ) class Meta: model = Sample fields = ('ApiUser','ApiKey','create_array','UserName','IPAddress')
适配drf-spectacular
用官方提供的schema扩展装饰器指定字段结构:
from drf_spectacular.utils import extend_schema_field, OpenApiObject, OpenApiTypes class SampleSerializer(serializers.ModelSerializer): @extend_schema_field(OpenApiObject( properties={ "name": OpenApiTypes.STR, "id": OpenApiTypes.STR } ), many=True) create_array = serializers.JSONField() class Meta: model = Sample fields = ('ApiUser','ApiKey','create_array','UserName','IPAddress')
内容的提问来源于stack exchange,提问作者sugnez
相关产品推荐
相关产品推荐

