Django嵌套模型字段序列化报错:QuerySet无法JSON序列化
解决Django嵌套对象序列化JSON问题
问题背景
模型定义如下:
class SurveyAnswer(models.Model): id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False) survey=models.ForeignKey("Survey",on_delete=models.CASCADE) answer=models.ForeignKey("Answer",on_delete=models.CASCADE) total_count=models.IntegerField(null=True,blank=True) total_percentage=models.FloatField(null=True,blank=True) class Meta: db_table="SurveyAnswer" class Answer(models.Model): id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False) name= models.CharField(max_length=100) def __str__(self) -> str: return self.name class Meta: db_table="Answer"
需求是获取所有SurveyAnswer记录及关联Answer的name字段,但现有序列化器报错Object of type QuerySet is not JSON serializable,序列化器代码:
class SurveyAnswerSerializer(serializers.ModelSerializer): answers=serializers.StringRelatedField() class Meta: model=SurveyAnswer fields=["id","total_count","total_percentage","answers",]
尝试转成列表查询后返回空对象:
survey_answers=list(SurveyAnswer.objects.filter(survey=survey).select_related('answer')) data=SurveyAnswerSerializer(survey_answers).data
解决方法
1. 修正序列化器字段名与参数
SurveyAnswer中外键字段是answer(单数),不是answers,同时StringRelatedField需要指定read_only=True。如果只想获取Answer的name字段,有两种简洁实现方式:
class SurveyAnswerSerializer(serializers.ModelSerializer): # 方法一:利用Answer的__str__方法返回name answer = serializers.StringRelatedField(read_only=True) # 方法二:直接指定取name字段,逻辑更明确 # answer = serializers.SlugRelatedField(slug_field='name', read_only=True) class Meta: model = SurveyAnswer fields = ["id", "total_count", "total_percentage", "answer"]
2. 序列化集合数据时添加many=True
当序列化多条数据(QuerySet或列表)时,必须在序列化器实例化时传入many=True,否则无法正确处理集合类型:
survey_answers = SurveyAnswer.objects.filter(survey=survey).select_related('answer') # 关键:添加many=True标识处理多条数据 data = SurveyAnswerSerializer(survey_answers, many=True).data
错误原因说明
- 最初的序列化报错:一是序列化器字段名写错(
answers对应不上模型的answer外键),二是序列化多条数据未传入many=True,导致无法识别QuerySet类型。 - 转成列表后返回空对象:依然未修正字段名错误,也没加
many=True,序列化器无法正确解析集合数据,最终返回空结构。
内容的提问来源于stack exchange,提问作者ftdeveloper
相关产品推荐
相关产品推荐

