如何在 Django 中使用 PostgreSQL 9.2 JSON 数据类型?

Posted

技术标签:

【中文标题】如何在 Django 中使用 PostgreSQL 9.2 JSON 数据类型?【英文标题】:How do I use PostgreSQL 9.2 JSON data type in Django? 【发布时间】:2012-09-06 07:50:21 【问题描述】:

PostgreSQL 9.2 支持原生 json 数据类型。如何创建可以将此数据类型用作模型字段之一的 django 模型?

【问题讨论】:

【参考方案1】:

[注。自从问题发布以来发生了很多事情,所以我也想更新答案 - 现在包括新的 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 版本中提供。

来源:mjtamlyn blog

Psycopg现在还原生支持JSON field(以及HSTORE)。

** 在 Django 中DIY **

在 django 中,创建您自己的使用特殊数据库类型的模型字段非常容易,请参阅 field db_type()。

请注意:

    这仅适用于 pgSQL - 您限制了代码的可移植性(尽管您可以有条件地在其他数据库上返回“文本”类型) 您目前将主要获得数据库端 json 验证 当然还有直接检索 JSON 对象的乐趣!

但是要注意 Python 没有 /direct/ 对 JSON 的支持,所以你并没有真正跳过 python 中的 json 转储/加载成本;您确实避免了字符串转换 - 但我没有检查内部结构或进行基准测试以查看是否有任何真正的区别。

使用 PostgreSQL 9.3 及以下版本看起来可能会变得更有趣

您也可以从django JSONField 开始并已经获得了很多样板代码,只需覆盖db_type 方法即可。

在我看来,更有趣且更值得锁定数据库(无论如何,我喜欢 pgSql!),是 pgSQL 中的选项,可以使用 array_to_json and row_to_json 将数据重新调整为 JSON 结构。 不过,这需要对查询集进行更严重的更改,这听起来超出了您的问题范围。

【讨论】:

不能索引json类型里面的字段吗? 下面的链接显示了一个允许索引的选项,基本上将它从文本更改为字符字段github.com/bradjasper/django-jsonfield#other-fields 有同样的问题,还有几个数据点:(1) django-pgfields 提供了使用 JSON 数据类型的包装器,但没有对 Postgres JSON 查找功能的本机访问。 (2) 一个 kickstarter 于 2014 年 2 月获得全额资助,以实现对 django.contrib.postgres 中所有 Postgres 数据类型的原生 Django 支持,目标交付为 Django 1.8。公开发布的代码只发展到非常基本的功能:kickstarter.com/projects/mjtamlyn/… 是的,不幸的是,Kickstarted 项目似乎已经死了:postgres.mjtamlyn.co.uk/category/blog.html【参考方案2】:

从 Django 1.9 开始,JSONField 在 Django 附带的 django.contrib.postgres.fields 模块中可用。该字段使用 PostgreSQL 字段类型jsonb(不是 json)。

【讨论】:

以上是关于如何在 Django 中使用 PostgreSQL 9.2 JSON 数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django Python 中使用 PostgreSQL 为 SQLAlchemy 连接池设置方言?需要启用预 ping 功能

使用 Django + PostgreSQL 进行快速搜索

如何在 Django 应用程序中访问 PostgreSQL 数据库

如何在 Django ORM 中映射 PostgreSQL 数组字段

在 django ORM 中使用 postgresql 窗口函数的干净方法?

Django:如何在 Postgresql 中对日语(多字节字符串)进行全文搜索