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

Django 2.2+Djongo下DRF中ArrayModelField序列化异常求助

解决Djongo ArrayModelField序列化异常问题

我一眼就发现问题所在了——你的SceneSerializer里嵌套序列化器的写法有误,导致DRF没法正确解析ArrayModelField里的Comment对象,只能输出它们的字符串表示形式。

具体修复方案:

你需要调整SceneSerializer中comments字段的定义位置,并添加many=True参数来适配数组类型:

修改后的serializers.py代码如下:

from rest_framework import serializers
from planning.models import Scene, Comment

class CommentSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Comment
        fields = ('text', 'author')

class SceneSerializer(serializers.HyperlinkedModelSerializer):
    # 把comments字段移到Serializer类顶层,添加many=True适配数组
    comments = CommentSerializer(many=True)
    
    class Meta:
        model = Scene
        fields = ('id', 'title', 'comments')

为什么这样改能解决问题?

  • DRF的嵌套序列化器必须声明在Serializer类的顶层,而不是Meta类内部。之前你把comments = CommentSerializer()放在Meta里,相当于这个配置完全没生效,DRF只能用模型字段的默认序列化逻辑(调用对象的__str__方法转成字符串)。
  • many=True是核心参数:因为comments是ArrayModelField,对应一组Comment实例,必须告诉序列化器要处理的是对象数组,而非单个对象。

修改完成后,你的GET接口就能输出符合预期的嵌套JSON格式了:

[
    {
        "id": "28db3aa8-34ef-4880-a3eb-57643814af22",
        "title": "scene 1",
        "comments": [
            {"author": "edward", "text": "comment1"},
            {"author": "edward", "text": "comment2"}
        ]
    }
]

另外提个小建议:你的模型代码里有不少多余的分号(比如text = models.TextField();),Python虽然允许这种写法,但建议去掉以保持代码风格统一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:12:43