Django
JSONField - PostgreSQL固有のフィールド
サーチ…
構文
- JSONField(**オプション)
備考
Djangoの
JSONField
実際にPostgresJSONB
カラムにデータを格納します。これはPostgres 9.4以降でのみ利用可能です。JSONField
は、より柔軟なスキーマが必要な場合にJSONField
です。たとえば、データの移行を行わずにキーを変更したい場合や、すべてのオブジェクトが同じ構造を持っていない場合などです。あなたは、静的キーを使用してデータを保存している場合は、複数の通常のフィールドの代わりに使用することを検討
JSONField
照会として、sの代わりにJSONField
時々かなり退屈得ることができます。
クエリの連鎖
クエリを連鎖させることができます。たとえば、リスト内に辞書が存在する場合は、2つのアンダースコアと辞書クエリを追加します。
二重のアンダースコアでクエリを区切ることを忘れないでください。
JSONFieldの作成
Django 1.9以降で利用可能
from django.contrib.postgres.fields import JSONField
from django.db import models
class IceCream(models.Model):
metadata = JSONField()
必要に応じて、通常の**options
追加することができます。
!あなたの
settings.py
INSTALLED_APPS
に'django.contrib.postgres'
を入れなければならないことに注意してください
JSONFieldにデータを含むオブジェクトを作成する
ネイティブのPython形式でデータを渡します(例えば、 list
、 dict
、 str
、 None
、 bool
など)。
IceCream.objects.create(metadata={
'date': '1/1/2016',
'ordered by': 'Jon Skeet',
'buyer': {
'favorite flavor': 'vanilla',
'known for': ['his rep on SO', 'writing a book']
},
'special requests': ['hot sauce'],
})
実際に
JSONField
を使用するJSONField
については、「備考」の項を参照してください。
トップレベルのデータのクエリ
IceCream.objects.filter(metadata__ordered_by='Guido Van Rossum')
辞書にネストされたデータの照会
チョコレート好きな人が注文したすべてのアイスクリームコーンを入手してください:
IceCream.objects.filter(metadata__buyer__favorite_flavor='chocolate')
問合せの連鎖については、「注意」の項を参照してください。
配列に存在するデータのクエリ
整数はインデックスルックアップとして解釈されます。
IceCream.objects.filter(metadata__buyer__known_for__0='creating stack overflow')
問合せの連鎖については、「注意」の項を参照してください。
JSONField値による注文
Djangoでは、 JSONField
で直接注文することはまだサポートされていません。しかし、jSQLbのPostgreSQL関数を使ってRawSQLを介して行うことができます:
from django.db.models.expressions import RawSQL
RatebookDataEntry.objects.all().order_by(RawSQL("data->>%s", ("json_objects_key",)))
この例では、 data['json_objects_key']
という名前のJSONField
内のdata['json_objects_key']
をJSONField
data
。
data = JSONField()