如何在Angular与Django中通过POST方法传递数组类型数据?
问题根源
你遇到的报错是因为Django REST Framework(以下简称DRF)的序列化器没有正确接收到符合预期格式的学生ID列表,核心有两个常见原因:
- 你通过
FormData提交JSON序列化后的学生列表,后端处理时QueryDict的特性导致列表赋值异常 - 你编写的
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
相关产品推荐
相关产品推荐

