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
相关产品推荐
相关产品推荐

