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

Django Rest Framework嵌套数据序列化器问题排查

问题分析与解决方案

1. standard_test_score 必填错误修复

你的TestScoreThroughModelSerializer存在字段映射错误:模型TestScoreThroughModel中关联StandardTestScore的字段是standard_test_score,但你在序列化器里用了id作为字段名且未正确映射到模型字段,导致DRF无法正确解析前端传入的数据,进而触发必填验证错误。

修改TestScoreThroughModelSerializer:

class TestScoreThroughModelSerializer(serializers.ModelSerializer):
    # 将id字段映射到模型的standard_test_score外键
    id = serializers.PrimaryKeyRelatedField(queryset=StandardTestScore.objects.all(), source='standard_test_score')
    score = serializers.IntegerField()

    class Meta:
        model = TestScoreThroughModel
        fields = ['id', 'score']

2. hobbies 和 behavior_challenges 类型错误修复

两个问题叠加导致该错误:

  • 未在create方法中处理多对多字段的赋值:多对多字段不能通过Model.objects.create()直接赋值,需先创建对象再通过add()方法添加关联。
  • 需确认前端传入的是整数数组而非字符串形式的数字(如["1","2"]会触发类型错误)。

修改ChildSerializer的create方法,手动处理多对多字段:

def create(self, validated_data):
    # 先取出多对多字段数据
    hobbies_data = validated_data.pop('hobbies', [])
    behavior_challenges_data = validated_data.pop('behavior_challenges', [])
    test_scores_data = validated_data.pop('testscorethroughmodel_set', [])
    
    # 创建Child对象
    child = Child.objects.create(**validated_data)
    
    # 关联多对多数据
    child.hobbies.add(*hobbies_data)
    child.behavior_challenges.add(*behavior_challenges_data)
    
    # 处理中间表数据
    for test_score_data in test_scores_data:
        TestScoreThroughModel.objects.create(child=child, **test_score_data)
    
    return child

同时检查Postman请求体,确保hobbies和behavior_challenges是整数数组:

"hobbies": [1, 2],
"behavior_challenges": [1]

3. 可选优化:设置字段非必填(若业务允许)

如果允许standard_test_score为空,可在ChildSerializer的对应字段添加required=False:

standard_test_score = TestScoreThroughModelSerializer(many=True, source='testscorethroughmodel_set', required=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 07:34:53