Django视图中新增属性无法在JSON响应中显示,如何解决?
解决Django默认序列化器不包含动态添加属性的问题
问题原因
Django自带的django.core.serializers只会序列化模型类中定义的数据库字段,你动态添加到实例的new_attribute属于临时属性,不在序列化器的默认处理范围内,因此不会出现在JSON响应中。而模板能正常访问是因为模板直接读取实例的所有属性,不受数据库字段限制。
解决方案
方法一:手动构造数据字典后序列化
手动遍历对象,组装包含默认字段和动态属性的字典列表,再用json模块序列化,完全自定义输出内容:
import json from django.http import HttpResponse from django.core import serializers def stats(request): items = MyItem.objects.all().order_by('-id') serialized_data = [] for item in items: # 将单个对象转为Python字典格式,提取默认字段 item_data = serializers.serialize('python', [item])[0] # 把动态属性添加到字段字典中 item_data['fields']['new_attribute'] = 10 # 整理成简洁的输出结构 simplified_item = { 'id': item_data['pk'], **item_data['fields'] } serialized_data.append(simplified_item) # 将字典序列化为JSON字符串 items_json = json.dumps(serialized_data) return HttpResponse(items_json, content_type='application/json')
方法二:自定义序列化器类
继承Django默认的序列化器,重写get_dump_object方法,在序列化时注入动态属性:
from django.http import HttpResponse from django.core.serializers import Serializer from django.core.serializers.json import DjangoJSONEncoder class CustomMyItemSerializer(Serializer): def get_dump_object(self, obj): # 获取默认序列化的字段数据 dump_data = super().get_dump_object(obj) # 添加动态属性到字段中 dump_data['fields']['new_attribute'] = obj.new_attribute return dump_data def stats(request): items = MyItem.objects.all().order_by('-id') for item in items: item.new_attribute = 10 # 使用自定义序列化器序列化对象 serializer = CustomMyItemSerializer() items_json = serializer.serialize(items, cls=DjangoJSONEncoder) return HttpResponse(items_json, content_type='application/json')
内容的提问来源于stack exchange,提问作者Marin Leontenko
相关产品推荐
相关产品推荐

