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