Поиск…


Синтаксис

  • JSONField (** опция)

замечания

  • JSONField Django фактически хранит данные в столбце Postgres JSONB , который доступен только в 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()


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow