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

不使用Django REST Framework实现模型嵌套序列化可行吗?

不用Django REST Framework实现嵌套序列化的方案

Django原生的serialize()函数不支持你期望的foreignKeyField.some_value这种点语法直接嵌套外键字段的写法,不过可以通过以下几种方式实现类似的嵌套序列化效果:

方法1:手动构造字典后序列化

直接遍历模型对象及其关联的外键对象,手动组装需要的字段结构,再用json.dumps完成序列化:

import json
from django.core.serializers.json import DatetimeJSONEncoder

def serialize_my_model(obj):
    # 构造基础字段与嵌套外键结构
    data = {
        'id': obj.id,
        'foreignKeyField': {
            'some_value': obj.foreignKeyField.some_value,
            # 可按需添加更多外键关联字段
            'another_value': obj.foreignKeyField.another_value
        }
    }
    return json.dumps(data, cls=DatetimeJSONEncoder)

# 使用示例
data = serialize_my_model(myModelObject)

方法2:自定义序列化器类

模仿DRF序列化器的思路,自己实现一个轻量序列化器类,支持嵌套字段定义:

import json
from django.core.serializers.json import DatetimeJSONEncoder

class MyModelSerializer:
    def __init__(self, instance):
        self.instance = instance

    def to_dict(self):
        return {
            'id': self.instance.id,
            'foreignKeyField': {
                'some_value': self.instance.foreignKeyField.some_value,
                'other_field': self.instance.foreignKeyField.other_field
            }
        }

    def to_json(self):
        return json.dumps(self.to_dict(), cls=DatetimeJSONEncoder)

# 使用示例
serializer = MyModelSerializer(myModelObject)
data = serializer.to_json()

方法3:用QuerySet.values()预查询嵌套字段

如果处理的是QuerySet而非单个对象,可以用values()配合双下划线语法提前取出外键关联字段,再调整结构后序列化:

import json
from django.core.serializers.json import DatetimeJSONEncoder

# 先查询出包含外键字段的原始数据
queryset_data = list(MyModel.objects.filter(...).values(
    'id',
    'foreignKeyField__some_value',
    'foreignKeyField__another_value'
))

# 转换为嵌套格式
formatted_data = []
for item in queryset_data:
    formatted_item = {
        'id': item['id'],
        'foreignKeyField': {
            'some_value': item['foreignKeyField__some_value'],
            'another_value': item['foreignKeyField__another_value']
        }
    }
    formatted_data.append(formatted_item)

# 序列化最终结构
data = json.dumps(formatted_data, cls=DatetimeJSONEncoder)

这几种方法都不需要依赖Django REST Framework,能实现你需要的嵌套序列化效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:05:24