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.