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

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的默认序列化器,直接存入原始字典:

  1. 先在项目settings.py中添加配置:
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
  1. 直接存取数据即可,无需额外序列化:
# 存
request.session['weather_data'] = session_data

# 取
session_data = request.session.get('weather_data')

注意:Pickle序列化存在反序列化不可信数据的安全风险,仅当你存入session的内容完全由业务端生成、不会被用户篡改时可以使用该方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:09:02