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

Django DRF TestTakerSerializer获取users_answers_set字段AttributeError报错

问题原因

Django 反向关联的默认命名规则为:对于从模型A指向模型B的ForeignKey字段,B的实例访问关联的A实例集合时,默认反向关联名称是A的类名全小写 + _set。
你代码中UsersAnswers的类名转全小写为usersanswers,所以TestTaker实例的默认反向关联属性名为usersanswers_set,你序列化器中写的users_answers_set多了一个下划线,自然找不到对应属性,这就是报错的核心原因。

解决方案

你可以任选以下任意一种方案解决问题:

  • 方案1:直接修改序列化器字段名匹配默认反向名
    直接把TestTakerSerializer里的字段名改成和默认反向名一致即可:
    class TestTakerSerializer(serializers.ModelSerializer):
        usersanswers_set = UsersAnswersSerializer(many=True)
        class Meta:
            model = TestTaker
            fields = "__all__"
    
  • 方案2:保留现有字段名,配置正确的source参数
    你之前加source参数没生效,是因为source值没有填对正确的反向关联名,正确写法如下:
    class TestTakerSerializer(serializers.ModelSerializer):
        users_answers_set = UsersAnswersSerializer(many=True, source="usersanswers_set")
        class Meta:
            model = TestTaker
            fields = "__all__"
    
  • 方案3:自定义反向关联名(推荐,可读性更高)
    直接在模型的外键字段上指定你想要的反向关联名,不需要修改序列化器现有代码:
    # 修改models.py里的UsersAnswers模型
    class UsersAnswers(models.Model):
        test_taker = models.ForeignKey(TestTaker, on_delete=models.CASCADE, related_name="users_answers_set")
        question = models.ForeignKey(Question, on_delete=models.CASCADE)
        answer = models.ForeignKey(Answer, on_delete=models.CASCADE)
    
额外注意事项

如果你的序列化器需要支持创建/更新操作(不是仅用于查询),DRF的嵌套序列化默认是只读的,你需要重写TestTakerSerializer的create()和update()方法,手动处理嵌套的用户答案数据的保存逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:30:02