23

PostgreSQL 9.2 では、ネイティブの json データ型がサポートされています。このデータ型をモデル フィールドの 1 つとして使用できる django モデルを作成するにはどうすればよいですか?

4

2 に答える 2

30

[注。質問が投稿されてから多くのことが起こったので、回答も更新することを考えました - 現在、新しい Django-postgresql と PostgreSQL 9.3 の情報が含まれています]

PostgreSQL 9.3

PostgreSQL での JSON サポート (ドキュメントを参照してください。ますます興味深いものになっています。データベースの列であるかのように JSON フィールドを検索できるようになりました! このサポートはまだ基本的なものであり、標準の列演算子 (前を参照) と同等ではありません。そのため、Django ORM を介して使用するのは面倒です。

PostgreSQL 9.2

pgSQL 9.2 ではJSON データ型は基本的にテキストです。追加されたのは JSON 検証です。これは便利ですが、頭が回るほどではありません。

**Django と PostgreSQL JSON

Django での高度な PostgreSQL サポートのための最近のKickstarted 支援開発は、数か月前に資金提供を受けました。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の下でのみ機能します-コードの移植性を制限しています(ただし、他のデータベースでは条件付きで「テキスト」タイプを返すことができます)
  2. 現在、ほとんどの場合、データベース側の json 検証のみが得られます
  3. そしてもちろん、JSON オブジェクトを直接取得できる喜びも!

ただし、Python には JSON の /direct/ サポートがないことに注意してください。したがって、Python で json のダンプ/ロード コストを実際にスキップしているわけではありません。文字列変換は避けていますが、実際の違いがあるかどうかを確認するために内部をチェックしたり、ベンチマークを行ったりしていません。

PostgreSQL 9.3 以降では、もっと面白くなりそうです

また、 django の JSONFieldから開始して、すでに多数のボイラーコード プレートを取得し、db_typeメソッドをオーバーライドすることもできます。

私の意見では、より興味深く、データベース ロックインの価値があると思われるのは (いずれにせよ pgSql が大好きです!)、 and を使用してデータを JSON 構造として返す pgSQL のオプションarray_to_jsonですrow_to_json。ただし、これにはクエリセットのより深刻な変更が必要になりますが、これは質問の範囲外に聞こえます。

于 2012-09-17T09:01:47.127 に答える
13

Django 1.9 の時点で、Djangoに同梱JSONFieldされているモジュールで利用できます。django.contrib.postgres.fieldsこのフィールドは、PostgreSQL フィールド タイプjsonb (json ではありません) を使用します。

于 2015-12-08T21:27:36.270 に答える