Django原生序列化器转JSON报'str' object has no attribute '_meta'错误
报错根因
你调用的serializers.serialize()是Django ORM专属的序列化工具,仅接收模型实例、QuerySet作为入参,你传入普通Python字典自然会触发缺少模型专属_meta属性的报错。
解决方案
这里提供两种常用的可行方案,按需选择即可:
方案1:使用标准JSON序列化(推荐,无安全风险)
借助Django内置的DjangoJSONEncoder处理时间类型字段的序列化,无需额外依赖:
存储数据到session
import json import datetime from django.core.serializers.json import DjangoJSONEncoder # 你的原始字典 session_data = {'city_name': 'Srinagar', 'description': 'few clouds', 'temp': 26.74, 'feels_like': 27.07, 'max_temp': 26.74, 'min_temp': 26.74, 'sunrise': datetime.time(6, 11, 10), 'sunset': datetime.time(18, 43, 59)} # 序列化为JSON字符串后存入session request.session['weather_data'] = json.dumps(session_data, cls=DjangoJSONEncoder)
从session读取数据
import json from django.utils.dateparse import parse_time session_data_json = request.session.get('weather_data') if session_data_json: session_data = json.loads(session_data_json) # 可选:将序列化后的时间字符串转回datetime.time对象 session_data['sunrise'] = parse_time(session_data['sunrise']) session_data['sunset'] = parse_time(session_data['sunset'])
方案2:使用Pickle序列化(更简便,仅适用于可信数据)
如果不想手动处理类型转换,可以修改Django session的默认序列化器,直接存入原始字典:
- 先在项目
settings.py中添加配置:
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
- 直接存取数据即可,无需额外序列化:
# 存 request.session['weather_data'] = session_data # 取 session_data = request.session.get('weather_data')
注意:Pickle序列化存在反序列化不可信数据的安全风险,仅当你存入session的内容完全由业务端生成、不会被用户篡改时可以使用该方案。
内容的提问来源于stack exchange,提问作者Atif Shafi
相关产品推荐
相关产品推荐

