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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:42:39