为了账号安全,请及时绑定邮箱和手机立即绑定

Django:'datetime' 类型的对象不是 JSON 可序列化的

Django:'datetime' 类型的对象不是 JSON 可序列化的

POPMUISE 2021-10-26 15:31:14
我正在尝试在我的会话中保存日期。我总是收到错误Object of type 'datetime' is not JSON serializable。我发现这这里的Django的文档:stored as seconds since epoch since datetimes are not serializable in JSON.如何将我的保存expiry_date为秒而不是日期时间?code = social_ticketing_form.cleaned_data['a']expiry_date = timezone.now() + timezone.timedelta(days=settings.SOCIAL_TICKETING_ATTRIBUTION_WINDOW)request.session[social_ticketing_cookie_name(request.event)] = {'code': code, 'expiry_date': expiry_date}
查看完整描述

1 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

要么编写自己的会话序列化器以允许您datetime直接序列化对象,要么datetime以其他形式存储值。


如果要将其保存为秒,请使用以下datetime.timestamp()方法:


request.session[social_ticketing_cookie_name(request.event)] = {

    'code': code, 

    'expiry_date': expiry_date.timestamp()

}

您自己的SESSION_SERIALIZER类只需要提供loads和dumps方法,直接类似于json.loads()和json.dumps()(这是标准 JSON 序列化器的实现方式)。


如果您想对datetime对象进行编码并能够将它们datetime再次透明地转换回对象,我将使用嵌套对象格式将此类值标记为特殊值:


from datetime import datetime


class JSONDateTimeSerializer:

    @staticmethod

    def _default(ob):

        if isinstance(ob, datetime):

            return {'__datetime__': ob.isoformat()}

        raise TypeError(type(ob))


    @staticmethod

    def _object_hook(d):

        if '__datetime__' in d:

            return datetime.fromisoformat(d['__datetime__'])

        return d


    def dumps(self, obj):

        return json.dumps(

            obj, separators=(',', ':'), default=self._default

        ).encode('latin-1')


    def loads(self, data):

        return json.loads(

            data.decode('latin-1'), object_hook=self._object_hook

        )

并设置SESSION_SERIALIZER为上述模块的全限定名 ( path.to.module.JSONDateTimeSerializer)。


以上使用了Python 3.7 中新增的datetime.fromisoformat()方法。


查看完整回答
反对 回复 2021-10-26
  • 1 回答
  • 0 关注
  • 271 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号