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

Django抽象模型嵌套API返回__str__而非JSON结构问题求助

解决Django嵌套抽象模型序列化返回__str__内容的问题

你遇到的问题本质上是Django REST Framework的ModelSerializer默认不会自动处理EmbeddedModelField类型的嵌套模型,而是直接调用模型的__str__方法生成序列化结果。要得到你期望的嵌套JSON结构,只需要给抽象模型单独定义序列化器,并在父序列化器中显式引用它即可,完全不用修改__str__方法。

具体修改步骤:

1. 为抽象模型SomeModel定义序列化器

首先创建对应SomeModel的序列化器,明确指定需要序列化的字段:

from rest_framework import serializers
from .models import SomeModel

class SomeModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = SomeModel
        fields = ('a', 'b')  # 列出你需要返回的所有字段

2. 修改父序列化器ParentSerializer

在父序列化器中,显式声明someModel字段使用上面定义的SomeModelSerializer,同时注意fields要写成元组(别漏了末尾的逗号,否则会被识别为字符串):

class ParentSerializer(serializers.ModelSerializer):
    # 显式指定嵌套字段的序列化规则
    someModel = SomeModelSerializer()
    
    class Meta:
        model = ParentModel
        fields = ('someModel',)  # 逗号必须保留,确保这是一个元组

3. 模型与视图保持不变

你的SomeModel、ParentModel以及ParentViewSet不需要做任何修改,保持原有代码即可。

修改后的效果

现在访问API时,返回的JSON结构会完全符合你的预期:

{
    "someModel": {
        "a": "something",
        "b": "something else"
    }
}

补充说明

  • 为什么原方式不生效?因为DRF的ModelSerializer对EmbeddedModelField这类非标准字段(通常来自第三方库如django-mongodb-engine),不会自动推断需要嵌套序列化,默认会 fallback 到模型的__str__输出。
  • __str__方法的作用是在Django后台、命令行等场景展示模型的友好名称,和API序列化逻辑应该完全分离,没必要为了API修改它。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:10:06