Warning

In order for any of the features described below to work, you must use the PostgresManager or inherit your models from PostgresModel. Read more about this in Managers & Models.

HStore

psqlextra.fields.HStoreField is based on Django’s HStoreField and therefore supports everything Django does natively and more.

Constraints

Unique

The uniqueness constraint can be added on one or more hstore keys, similar to how a UNIQUE constraint can be added to a column. Setting this option causes unique indexes to be created on the specified keys.

You can specify a list of strings to specify the keys that must be marked as unique:

from psqlextra.fields import HStoreField
from psqlextra.models import PostgresModel

class MyModel(PostgresModel):
    myfield = HStoreField(uniqueness=['key1']

MyModel.objects.create(myfield={'key1': 'value1'})
MyModel.objects.create(myfield={'key1': 'value1'})

The second create() call will fail with a IntegrityError because there’s already a row with key1=value1.

Uniqueness can also be enforced “together”, similar to Django’s unique_together by specifying a tuple of fields rather than a single string:

myfield = HStoreField(uniqueness=[('key1', 'key2'), 'key3'])

In the example above, key1 and key2 must unique together, and key3 must unique on its own. By default, none of the keys are marked as “unique”.

Required

The required option can be added to ensure that the specified hstore keys are set for every row. This is similar to a NOT NULL constraint on a column. You can specify a list of hstore keys that are required:

from psqlextra.fields import HStoreField
from psqlextra.models import PostgresModel

class MyModel(PostgresModel):
    myfield = HStoreField(required=['key1'])

    mymodel.objects.create(myfield={'key1': none})
    MyModel.objects.create(myfield={'key2': 'value1'})

Both calls to create() would fail in the example above since they do not provide a non-null value for key1. By default, none of the keys are required.