PostgreSQL 9.2 имеет встроенную поддержку типа данных json. Как создать модель django, которая может использовать этот тип данных как одно из полей модели?
Как использовать тип данных JSON PostgreSQL 9.2 в Django?
Ответ 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).