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

