Подтвердить что ты не робот

Как использовать тип данных JSON PostgreSQL 9.2 в Django?

PostgreSQL 9.2 имеет встроенную поддержку типа данных json. Как создать модель django, которая может использовать этот тип данных как одно из полей модели?

4b9b3361

Ответ 1

[Nb. Много было с тех пор, как вопрос был отправлен, поэтому я подумал также об обновлении ответа - теперь, включая новую информацию Django-postgresql и PostgreSQL 9.3]

PostgreSQL 9.3

Поддержка JSON в PostgreSQL (см. doc становится все более интересной. Теперь можно искать в полях JSON, как если бы они были столбцами базы данных! Эта поддержка по-прежнему является базовой и не соответствует стандартным операторам столбцов (см. Выше), поэтому ее не следует использовать через Django ORM.

PostgreSQL 9.2

Тип данных JSON в основном текст в pgSQL 9.2. Добавленная проверка JSON - полезная, но не поворот головы.

** Django и PostgreSQL JSON

Недавняя поддержка, поддерживаемая Kickstarted для расширенной поддержки PostgreSQL в Django, была профинансирована несколько месяцев назад. Он будет включать расширенную поддержку типа JSON, но, вероятно, только в 9.4:

Команда Postgres недавно объединила поддержку jsonb datatype - двоичного хранимого JSON. Весьма вероятно, что я задержу поддержку JSON до тех пор, пока Postgres 9.4 не выйдет и будет поддерживать только тип данных jsonb. Этому есть несколько причин, самое главное, что текущий тип данных json сильно ограничен в своей реализации, не имея даже оператора равенства. Это означает, что некоторые части кода аннотации Django генерируют недопустимые запросы (см. Этот отчет), а также означает, что поиск __exact должен быть запрещен. Чтобы правильно обрабатывать все эти крайние случаи в Django, вы получите огромную сложность, а преимущества, которые вы получаете за то, что просто сохраняете json в текстовом поле, на самом деле весьма ограничены. 9.4 ожидается к концу этого года, поэтому в результате JSON-поля, скорее всего, будут доступны только в версии 1.8.

Источник: блог mjtamlyn

Psycopg также теперь поддерживает исходное поле JSON (as а также HSTORE).

** DIY в Django **

В django довольно легко создать собственное поле модели, которое использует специальный тип базы данных, см. поле db_type().

Обратите внимание, что:

  • это будет работать только в pgSQL - вы ограничиваете переносимость кода (хотя вы можете условно вернуть тип "текст" в других базах данных).
  • в настоящее время вы в основном получаете только проверку json на стороне базы данных
  • и, конечно же, удовольствие от непосредственного получения объекта JSON!

Но будьте осторожны, что у Python нет /direct/support для JSON, поэтому вы действительно не пропускаете стоимость jump dump/load в python; вы избегаете преобразования строк, но я не проверял внутренности или не тестировал, есть ли какая-либо реальная разница.

С PostgreSQL 9.3 и последующими выглядит как вещи могут стать более интересными

Вы также можете начать с django JSONField и получить много пластин боилекса, просто переопределите метод db_type.

Что звучит, на мой взгляд, более интересным и заслуживающим блокировки базы данных (я люблю pgSql, во всяком случае!), это вариант в pgSQL для перенастройки данных как структуры JSON с использованием array_to_json и row_to_json. Это потребует более серьезных изменений в запросах, хотя это и выходит за рамки вашего вопроса.

Ответ 2

Начиная с Django 1.9, JSONField доступен в модуле django.contrib.postgres.fields, который поставляется с Django. В этом поле используется тип поля PostgreSQL jsonb (не json).