You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:18:03