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

