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

如何在Angular与Django中通过POST方法传递数组类型数据?

问题根源

你遇到的报错是因为Django REST Framework(以下简称DRF)的序列化器没有正确接收到符合预期格式的学生ID列表,核心有两个常见原因:

  1. 你通过FormData提交JSON序列化后的学生列表,后端处理时QueryDict的特性导致列表赋值异常
  2. 你编写的to_internal_value方法大概率缩进错误,没有归属到NoticesSerializer类下,导致逻辑完全没有生效

解决方案

方案一(推荐,无需后端额外处理)

前端直接通过FormData原生支持的多同名字段方式传递数组,不需要JSON序列化,避免后端额外解析的开销和出错概率。

修改前端传参逻辑:

let noticeData = this.announceForm.value;
if (noticeData.students.includes('all')){
    noticeData.students = noticeData.students.filter((s) => s != 'all')
}
var formData = new FormData();
for (var key in noticeData) {
    // 单独处理学生ID数组,逐个添加到FormData
    if (key === 'students' && Array.isArray(noticeData[key])) {
        noticeData[key].forEach(studentId => {
            formData.append('students', studentId);
        })
    } else {
        formData.set(key, noticeData[key]);
    }
}

修改后删除后端to_internal_value的自定义逻辑即可,DRF会自动将多个students字段的值组装成列表,直接匹配PrimaryKeyRelatedField(many=True)的校验规则。

方案二(保留现有JSON序列化逻辑,修改后端处理)

如果必须保留前端JSON序列化的逻辑,需要修正to_internal_value的实现,同时确保方法缩进正确,归属到NoticesSerializer类内:

class NoticesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Notice
        fields = '__all__'

    # 注意缩进,方法要在类内部
    def to_internal_value(self, data):
        # 先把QueryDict转为普通字典,避免列表赋值异常
        tempdict = dict(data)
        # 提取FormData中被包裹为列表的学生JSON字符串
        if isinstance(tempdict['students'], list) and len(tempdict['students']) == 1:
            students_str = tempdict['students'][0]
        else:
            students_str = tempdict['students']
        tempdict['students'] = json.loads(students_str)
        return super().to_internal_value(tempdict)

    # to_representation方法也要缩进在类内部
    def to_representation(self, instance):
        representation = super(NoticesSerializer, self).to_representation(instance)
        try:
            representation['classroom'] = ClassroomsSerializer(instance.classroom, context=self.context).data
            students = StudentsSerializer(instance.students, many=True, context=self.context).data
            for student in students:
                student['classroom'] = student['classroom']['id']
            representation['students'] = students
        except Exception as error:
            print("ERROR SETTING REPRESENTATION FOR NOTICE SERIALIZER", error)
        return representation

内容的提问来源于stack exchange,提问作者Vishal Pandey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:45:03