Django
JSONField - поле PostgreSQL
Поиск…
Синтаксис
- JSONField (** опция)
замечания
JSONField
Django фактически хранит данные в столбце PostgresJSONB
, который доступен только в Postgres 9.4 и более поздних версиях.JSONField
подходит для более гибкой схемы. Например, если вы хотите изменить ключи, не выполняя никаких миграций данных, или если не все ваши объекты имеют одинаковую структуру.Если вы храните данные со статическими ключами, вместо этого вместо использования
JSONField
использовать несколько нормальных полей, так как запросJSONField
может быть довольно утомительным.
Цепочки запросов
Вы можете связать запросы вместе. Например, если словарь существует внутри списка, добавьте два символа подчеркивания и ваш словарь.
Не забудьте разделить запросы с двойными подчеркиваниями.
Создание JSONField
Доступно в Django 1.9+
from django.contrib.postgres.fields import JSONField
from django.db import models
class IceCream(models.Model):
metadata = JSONField()
Вы можете добавить обычные **options
если хотите.
! Обратите внимание, что вы должны поместить
'django.contrib.postgres'
вINSTALLED_APPS
вsettings.py
Создание объекта с данными в 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
на практике.
Запрос данных верхнего уровня
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
Заказ на JSONField
еще не поддерживается в Django. Но это возможно через RawSQL, используя функции PostgreSQL для jsonb:
from django.db.models.expressions import RawSQL
RatebookDataEntry.objects.all().order_by(RawSQL("data->>%s", ("json_objects_key",)))
Этот пример упорядочивает data['json_objects_key']
внутри JSONField
именем data
:
data = JSONField()