2012-09-13 42 views

回答

29

[Nb。發生了許多事情,因爲這個問題被張貼,所以我想更新的答案太 - 現在包括新的Django的PostgreSQL和PostgreSQL 9.3資料]

的PostgreSQL 9.3

JSON支持PostgreSQL中(見doc越來越更有趣的是,現在可以在JSON字段上搜索就好像它們是數據庫列一樣!這種支持仍然是基本的,與標準列運算符不同(見前),因此它將很快通過Django ORM 。

PostgreSQL 9.2

pgSQL 9.2中的JSON數據類型爲basically text。增加的是JSON驗證 - 有用,但不是轉向。

** Django和PostgreSQL的JSON

最近Kickstarted backed development在Django的高級PostgreSQL的支持是幾個月前的資助。它將包括對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)。

** DIY在Django **

在Django它很容易地創建一個使用特殊的數據庫類型自己的示範田,見field db_type()

請注意:

  1. 這隻會pgSQL的下工作 - 你限制你的代碼的可移植性(儘管你可以有條件地返回其他數據庫上一個「文本」類型)
  2. 你將目前大多獲得只有數據庫端json驗證
  3. 當然還有直接檢索JSON對象的樂趣!

但要小心,Python沒有/直接/支持JSON,所以你真的不跳過JSON轉儲/加載成本在Python中;你確實避免了字符串轉換 - 但我沒有檢查內部結構或進行基準測試,看看是否有任何實際差異。

在PostgreSQL 9.3及以下的模樣事情可能變得更加有趣

你也可以從django JSONField啓動,並得到了很多boilercode板已經,只需重寫db_type方法。

在我看來,聽起來更有趣並且值得數據庫鎖定(我喜歡pgSql,無論如何!),pgSQL中的選項是使用array_to_json and row_to_json作爲JSON結構重新使用數據。 這將需要一個更嚴重的變化來查詢集,雖然,這聽起來你的問題的範圍。

+0

你能否在JSON類型中的字段沒有索引? –

+0

下面的鏈接顯示了一個選項,允許索引,基本上從文本更改爲char場 https://github.com/bradjasper/django-jsonfield#other-fields – stormlifter

+0

有同樣的問題,一對夫婦更多的數據點: (1)'django的-pgfields'提供包裝器來使用JSON數據類型,而是Postgres的JSON查找特徵沒有本地訪問。 (2)2014年2月一個Kickstarter的是充分的資金回到落實所有Postgres的數據類型本地Django的支持'django.contrib.postgres'與目標交付的Django 1.8。公開發布的代碼只發展到非常基本的功能:https://www.kickstarter.com/projects/mjtamlyn/improved-postgresql-support-in-django – mirth23

8

從Django 1.9開始,JSONField可以在Django附帶的django.contrib.postgres.fields模塊中找到。該字段使用PostgreSQL字段類型jsonb(不是json)。

相關問題