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

Django序列化器返回空数组问题排查求助

Django SurveyResponseAnswer 多选答案返回空数组问题修复

问题描述

提交包含多选answers的POST请求后,返回的JSON中对应问题的answers字段始终为空数组,即使请求体中传递了有效的多选值。

问题根源

SurveyResponseAnswerCreateSerializer中,answers字段被定义为SerializerMethodField,该字段默认仅用于序列化输出(只读),无法处理POST请求的反序列化输入。这导致前端提交的answers数据不会被传递到模型创建逻辑中,最终SurveyResponseAnswer对象的answers字段在数据库中存储为null。后续序列化返回时,get_answers方法判断obj.answers为null,因此返回空数组。

修复方案

修改SurveyResponseAnswerCreateSerializer,将answers字段改为可读写的字段,并在序列化输出时处理空值转空数组的逻辑:

class SurveyResponseAnswerCreateSerializer(serializers.ModelSerializer):
    survey_question_id = serializers.IntegerField()
    # 替换只读的SerializerMethodField为可读写的ListField,匹配模型的ArrayField类型
    answers = serializers.ListField(
        child=serializers.CharField(max_length=100),
        required=False,
        allow_null=True
    )

    def to_representation(self, instance):
        # 序列化输出时,将null值转换为空数组
        data = super().to_representation(instance)
        data['answers'] = instance.answers if instance.answers else []
        return data

    class Meta:
        model = app_models.SurveyResponseAnswer
        exclude = ["survey_response", "survey_question"]

补充说明

  1. 上述修改后,反序列化阶段(创建数据)会正确接收前端提交的answers数组并保存到数据库;序列化阶段(返回数据)会自动将null转为空数组,保持返回格式统一。
  2. 需确保前端提交的字段名与序列化器字段名匹配:当前请求体中的answers是小写数组字段,与修改后的序列化器字段一致,无需额外调整。

内容的提问来源于stack exchange,提问作者Bryce Bangerter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:06:10