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

Tai*_*Tea 21 django postgresql json

PostgreSQL 9.2具有本机json数据类型支持.如何创建可以将此数据类型用作模型字段之一的django模型?

Ste*_*ano 30

[注.自问题发布以来发生了很多事情,所以我想更新答案 - 现在包括新的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.在Postgres 9.4退出并且只支持jsonb数据类型之前,我很可能会延迟JSON支持.这有几个原因,最重要的是当前的json数据类型在其实现中受到严重限制,甚至缺少相等运算符.这意味着Django注释代码的某些部分会生成无效查询(请参阅此报告),这也意味着必须禁止__exact查找.要在Django中正确处理所有这些边缘情况会导致大量的复杂性,并且您在文本字段中存储json所获得的好处实际上非常有限.9.4将于今年年底推出,因此JSON字段很可能仅在1.8版本中出现.

资料来源:mjtamlyn博客

Psycopg现在也支持 JSON字段(以及HSTORE).

**Django中的DIY**

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

请注意:

  1. 这只能在pgSQL下工作 - 你限制了你的代码可移植性(尽管你可以在其他数据库上有条件地返回'text'类型)
  2. 您目前主要只获得数据库端json验证
  3. 当然是直接检索JSON对象的乐趣!

但要小心Python没有/直接/支持JSON,所以你并没有真正跳过python中的json转储/加载成本; 你确实避免了字符串转换 - 但我没有检查内部或基准测试,看看是否有任何真正的区别.

使用PostgreSQL 9.3以及以下内容可能会变得更有趣

您也可以从django JSONField开始并获得大量的boilercode版,只需覆盖该db_type方法.

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


bju*_*son 12

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