【发布时间】:2012-09-06 07:50:21
【问题描述】:
PostgreSQL 9.2 支持原生 json 数据类型。如何创建可以将此数据类型用作模型字段之一的 django 模型?
【问题讨论】:
标签: json django postgresql
PostgreSQL 9.2 支持原生 json 数据类型。如何创建可以将此数据类型用作模型字段之一的 django 模型?
【问题讨论】:
标签: json django postgresql
[注。自从问题发布以来发生了很多事情,所以我也想更新答案 - 现在包括新的 Django-postgresql 和 PostgreSQL 9.3 信息]
PostgreSQL 9.3
PostgreSQL 中的 JSON 支持(参见 doc 变得越来越有趣。现在可以像搜索数据库列一样搜索 JSON 字段!这种支持仍然是基本的,与标准列运算符(见前),因此通过 Django ORM 使用它会很麻烦。
PostgreSQL 9.2
在 pgSQL 9.2 中 JSON 数据类型是 basically text。增加的是 JSON 验证 - 有用,但不令人头疼。
**Django 和 PostgreSQL JSON
几个月前为 Django 中的高级 PostgreSQL 支持提供了最近的 Kickstarted backed development。它将包括对 JSON 类型的高级支持,但可能仅在 9.4 中:
Postgres 团队最近合并了对 jsonb 数据类型的支持 - 二进制存储的 JSON。我很可能会延迟 JSON 支持,直到 Postgres 9.4 发布并且只支持 jsonb 数据类型。这有几个原因,最重要的是当前的 json 数据类型在其实现中受到严重限制,甚至缺少相等运算符。这意味着 Django 注释代码的某些部分会生成无效查询(请参阅此报告),也意味着必须禁止 __exact 查找。在 Django 中正确处理所有这些边缘情况会导致大量的复杂性,并且您获得的仅将 json 存储在文本字段中的好处实际上是非常有限的。 9.4 将于今年年底发布,因此 JSON 字段可能仅在 1.8 版本中提供。
Psycopg现在还原生支持JSON field(以及HSTORE)。
** 在 Django 中DIY **
在 django 中,创建您自己的使用特殊数据库类型的模型字段非常容易,请参阅 field db_type()。
请注意:
但是要注意 Python 没有 /direct/ 对 JSON 的支持,所以你并没有真正跳过 python 中的 json 转储/加载成本;您确实避免了字符串转换 - 但我没有检查内部结构或进行基准测试以查看是否有任何真正的区别。
使用 PostgreSQL 9.3 及以下版本看起来可能会变得更有趣
您也可以从django JSONField 开始并已经获得了很多样板代码,只需覆盖db_type 方法即可。
在我看来,更有趣且更值得锁定数据库(无论如何,我喜欢 pgSql!),是 pgSQL 中的选项,可以使用 array_to_json and row_to_json 将数据重新调整为 JSON 结构。
不过,这需要对查询集进行更严重的更改,这听起来超出了您的问题范围。
【讨论】:
django-pgfields 提供了使用 JSON 数据类型的包装器,但没有对 Postgres JSON 查找功能的本机访问。 (2) 一个 kickstarter 于 2014 年 2 月获得全额资助,以实现对 django.contrib.postgres 中所有 Postgres 数据类型的原生 Django 支持,目标交付为 Django 1.8。公开发布的代码只发展到非常基本的功能:kickstarter.com/projects/mjtamlyn/…