• 25 Июл
  • 2015
Postgres + JSON = hstore

Установка

sudo apt-get install postgresql-contrib
CREATE EXTENSION hstore;

pip install django-hstore

Если база данных уже существует, то при работе с проектом, скорее всего, вы получите ошибку:

hstore type not found in the database. please install it from your 'contrib/hstore.sql' file

Для ее решения делаем следующее:

psql template1 -c 'create extension hstore;'

psql application_db -c 'create extension hstore;'

Справку по django-hstore можно почитать здесь на великом и могучем языке древних янков.

Использование

from django_hstore import hstore

class List(models.Model):
    name = models.CharField(max_length=128)
    items = hstore.DictionaryField(schema=[
        {
            'name': 'title',
            'class': 'CharField',
            'kwargs': {'max_length': 128, }
        },
        {
            'name': 'memo',
            'class': 'CharField',
            'kwargs': {'max_length': 512, 'blank': True, }
        },
        {
            'name': 'done',
            'class': 'BooleanField',
            'kwargs': {'default': False, }
        },
    ])

Админка

В админке наше поле items, которое, по-сути является словарем (или объектом JSON) отображается как отдельные поля title, memo, done.

При этом, если мы будем делать запрос к базе:

List.objects.get(pk=1).items

то получим словарь:

{u'done': False, u'memo': u'test', u'title': u'test'}

comments powered by Disqus