Django:“datetime”类型的对象不可 JSON 序列化

2024-01-13

我正在尝试在我的会话中保存一个日期。我总是收到错误Object of type 'datetime' is not JSON serializable。我找到了这个here https://docs.djangoproject.com/en/2.1/topics/http/sessions/#using-sessions-out-of-views在 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}

Either 编写自己的会话序列化器 https://docs.djangoproject.com/en/stable/topics/http/sessions/#write-your-own-serializer允许你序列化datetime直接对象,或存储datetime某种其他形式的价值。

如果您想将其保存为秒,请使用datetime.timestamp() method https://docs.python.org/3/library/datetime.html#datetime.datetime.timestamp:

request.session[social_ticketing_cookie_name(request.event)] = {
    'code': code, 
    'expiry_date': expiry_date.timestamp()
}

你自己SESSION_SERIALIZER类只需要提供loads and dumps方法,直接类似于json.loads() and json.dumps()(这就是如何实现了标准 JSON 序列化器 https://github.com/django/django/blob/a8b03bea180e0660c0e159f3e7cf6192b512925f/django/core/signing.py#L81-L90).

如果你想编码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
        )

and set SESSION_SERIALIZER为上述模块的完整限定名称(path.to.module.JSONDateTimeSerializer).

上面使用的是datetime.fromisoformat() method https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat,Python 3.7 中的新功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django:“datetime”类型的对象不可 JSON 序列化 的相关文章

随机推荐

  • 64位函数返回32位指针

    这个函数被埋在一个复杂的嵌套中 所以实际上找到原因可能超出了我所能要求的范围 但我想知道是否有人能够提供一些关于我如何调试它的提示 这是我遇到问题的代码的要点 func1 c somestruct func1 somestruct myst
  • iOS - 如何判断本地通知是否导致我的应用程序进入前台?

    我的应用程序委托中有代码 application didReceiveLocalNotification 方法来显示UI警报视图对于本地通知 每当我的应用程序位于前台时 如果本地通知到达时我的应用程序在后台运行 则用户会收到该通知 并且能够
  • 如何仅使用 HTML 在 mozilla firefox 中打开本地文件?

    我正在尝试在 ubuntu 机器上使用 html 打开 Firefox 本地磁盘上的文件 但是 我面临文件未找到错误 我的代码如下 a href home abc workspace logfile log LOG FILE a 我尝试使用
  • 无法从包含库的应用程序启动意图

    您好 我想启动一项位于连接的图书馆项目中的服务 所有相关课程都在图书馆 该服务是从位于库中的活动调用的 Intent serviceIntent new Intent serviceIntent setAction org example
  • 如何在两个 Pandas DataFrame 对象上执行 SQL 样式不相交或设置差异?

    我正在尝试使用 Pandas 来解决一个白痴 DBA 没有对现已崩溃的数据集进行备份的问题 因此我正在尝试查找两列之间的差异 由于我不会详细说明的原因 我使用的是 Pandas 而不是数据库 我想做的是 考虑到 Dataset A A B
  • 自动装配 Spring JPA 存储库的 @Primary 等效项

    我在应用程序中使用 Spring JPA 存储库和实体 现在 在该应用程序的某种风格中 我需要扩展我的一个实体并提供一个扩展存储库 对于我需要覆盖 扩展的所有其他 bean 我只需创建一个新的实现并使用 Primary 对其进行注释 以便它
  • Android - 如何检索货币汇率[重复]

    这个问题在这里已经有答案了 我正在尝试为 Android 开发一个简单的外汇应用程序 首先 我需要获取过去一年的货币汇率 有人可以建议我该怎么做吗 我查看了 Google Financh API 但找不到如何检索货币汇率 任何建议表示赞赏
  • Clojure 时间和日期库是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我找不到处理时间和日期的库http clojure org libraries http clojur
  • 每个 SQL Server 外键都应该有一个匹配的索引吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在 SQL Server 数据库中为每个外键都有一个索引有哪些优点 如果有的话 是的 这是一个很好的做法 请参阅此处 SQL Server 何时
  • React 在 prop 更新时重新渲染组件

    我的想法 理解是 只要 props 或状态发生变化 React 组件就会更新 所以我声明我的变量 let percentage width 10 并有一个setInterval运行这么长时间后更改该变量的函数 setInterval fun
  • MongoDB Compass 社区身份验证失败

    我刚刚创建了一个新的 MongoDB 帐户 现在尝试连接通过 MongoDB Compass 社区应用程序创建的免费集群 但显示 身份验证失败 错误 这是我到目前为止检查过的 在我的 MongoDB Clusters 部分 当我单击 Con
  • Sparklyr 无法看到在 Hive 中创建的数据库,反之亦然

    我在本地安装了 Apache Hive 并尝试通过 Rstudio sparklyr 读取表 我使用 Hive 创建了一个数据库 hive gt CREATE DATABASE test 我尝试使用以下 R 脚本读取该数据库 library
  • 为什么这种并行搜索和替换没有使用 100% 的 CPU?

    我有一个很长的推文列表 200 万条 我使用正则表达式来搜索和替换这些推文中的文本 我使用一个运行这个joblib 平行图 https joblib readthedocs io en latest parallel html joblib
  • 如何对 DefaultAzureCredential 方法进行单元测试

    我使用默认的 azure 凭据方法获取访问令牌 同时使用函数应用程序的托管标识获取访问令牌 我能够获取令牌 但现在我不确定如何对该方法进行单元测试 这是当前状态 private async Task RefreshTokenCache va
  • 如何在 SQL Server 2005 中查找谁锁定了谁

    我正在研究 SQL Server 2005 SP3 从活动监视器中 我注意到许多处理器被锁定在挂起模式 你知道如何找到谁锁定了我的进程吗 exec sp who 会告诉您哪些进程被哪些其他进程阻止 您还可以使用 exec sp lock 查
  • Capybara::ElementNotFound:无法找到文件字段“文件”

    我正在测试文件上传 即 CSV 在我的代码和浏览器 HTML 中 我找到了文件字段 但在测试时 水豚无法找到该文件字段 我努力尝试不同的方法 但无法解决问题 这里部分看起来像这样 add file box div msg h1 page h
  • Android OpenGL ES - 我无法使 gluLookAt/gluPerspective 工作

    以下文字有点长 因为我想确保有类似问题的人 例如谷歌这个页面可以轻松地跟踪确切的问题及其解决方案 但现在谈谈我的问题 我最近开始在 Android 智能手机上进行 OpenGL ES 编程 并在理解如何使用 gluPerspective 和
  • 如何在 Mac OS X 10.5.8 上安装 Bash >= 3.2.25?

    我正在关注 Michael Hartl 的 Rails 教程 到目前为止我已经安装了 Git 1 7 5 4 x86 64 我正在运行 OSX 10 5 8 并且我正在尝试安装 rvm 我运行以下命令后 curl kL get rvm io
  • 正则表达式:以任意顺序匹配特定字符,每个字符的出现次数不超过指定的次数

    我有一个字符列表 例如 o b c c d o f 如果字符串包含不在该列表中的字符 我不希望它成为匹配项 如果一个字符串包含的某个字符出现的次数多于该列表中该字符出现的次数 我不希望它成为匹配项 字符串中的字符可以按任何顺序出现 并且不必
  • Django:“datetime”类型的对象不可 JSON 序列化

    我正在尝试在我的会话中保存一个日期 我总是收到错误Object of type datetime is not JSON serializable 我找到了这个here https docs djangoproject com en 2 1