Django JSONField внутри ArrayField

У меня есть проблема с вставкой в ​​поле с использованием ArrayField с JSONField внутри.

models.py

locations = ArrayField(JSONField(null = True,blank = True), blank=True, null = True) 

Вставить

 location_arr = [{"locations" : "loc1","amount":Decimal(100.00)},{"locations" : "loc2","amount":Decimal(200.25)}] instance.locations = location_arr instance.save() 

Когда я это делаю, я получил

«location» столбца имеет тип jsonb [], но выражение имеет тип text []

LINE 1: … d "= 2517," locations "= ARRAY ['{" loc …

Подсказка: вам нужно будет переписать или применить выражение.

Поэтому я попытался свалить его, используя:

 import json location_arr = [{"locations" : "loc1","amount":Decimal(100.00)},{"locations" : "loc2","amount":Decimal(200.25)}] instance.locations = json.dumps(location_arr) instance.save() 

то я получил это

LINE 1: … d "= 2517," locations "= '[{" loc ": …

DETAIL: "[" должен вводить явно заданные размеры массива.

Я использую:

  1. Django 1.9
  2. Python 2.7
  3. Postgres 9.4.10
  4. psycopg2 2.6.2

One Solution collect form web for “Django JSONField внутри ArrayField”

Массивы

Прежде всего, давайте внимательно рассмотрим этот важный текст из документа Postgresql Arrays .

Совет. Массивы не являются наборами; поиск определенных элементов массива может быть признаком неправильной настройки базы данных. Рассмотрите возможность использования отдельной таблицы со строкой для каждого элемента, который будет элементом массива. Это будет легче искать и, скорее всего, лучше масштабируется для большого количества элементов.

В большинстве случаев вы не должны использовать массивы.

JSONB

JSONB доступен в Django как тип JSONField. Это поле является более масштабируемым и гибким, чем поля массива, и его можно искать более эффективно. Однако если вы находите себя в полях JSONB все время, приведенное выше утверждение о Arrys одинаково справедливо для JSONB.

Что мы имеем в вашей системе? A массив, который содержит поле JSONB. Это катастрофа в ожидании. Пожалуйста, нормализуйте свои данные.

резюмировать

поэтому когда использовать ArrayField?

В редких случаях, когда вам не нужно искать в этом столбце, и вам не нужно использовать этот столбец для соединения.

  • Psycopg2, Postgresql, Python: самый быстрый способ вставки большого объема
  • Я пытаюсь установить psycopg2 на Mac OS 10.6.3; он утверждает, что не может найти «stdarg.h», но я вижу, что он там; что мне делать?
  • Стратегии шифрования с помощью Django + Postgres?
  • Есть ли ограничение на количество таблиц, которые может иметь база данных PostgreSQL?
  • Согласованность в postgresql с блокировкой и выбор для обновления
  • Psycopg / Postgres: подключения случайным образом вывешиваются
  • Как получить Введенный или выбранный идентификатор строки в postgres с помощью python
  • Использование INSERT с помощью базы данных PostgreSQL с использованием Python
  • SQLAlchemy или psycopg2?
  • Кортеж для списка - возвращаемый тип Python / PostgreSQL записи SETOF
  • Невозможно установить psycopg2 в virtualenv "error: stdarg.h: Нет такого файла или каталога"
  • Python - лучший язык программирования в мире.