Django
JSONField - поле PostgreSQL
Поиск…
Синтаксис
- JSONField (** опция)
замечания
JSONFieldDjango фактически хранит данные в столбце 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()