Configure EnumFields¶
All parameters available to the equivalent model field with choices may be set directly in the
EnumField
instantiation. If not provided
EnumField
will set choices
and max_length
automatically.
The following EnumField
specific parameters are available:
strict
¶
By default all EnumField
are strict
. This means a
ValidationError
will be thrown anytime
full_clean()
is run on a model and a value is set for the field that
can not be coerced to its native Enum
type. To allow the field to store values that
are not present in the fields Enum
type we can pass strict=False.
Non-strict fields will be instances of the enumeration where a valid Enum
value is
present and the plain old data where no Enum
type coercion is possible.
from django.db import models
from django_enum import EnumField
class StrictExample(models.Model):
class EnumType(models.TextChoices):
ONE = "1", "One"
TWO = "2", "Two"
non_strict = EnumField(
EnumType,
strict=False,
# it might be necessary to override max_length also,
# otherwise max_length will be 1
max_length=10,
)
obj = StrictExample()
# set to a valid EnumType value
obj.non_strict = '1'
# when accessed will be an EnumType instance
assert obj.non_strict is StrictExample.EnumType.ONE
# we can also store any string less than or equal to length 10
obj.non_strict = 'arbitrary'
obj.full_clean() # no errors
# when accessed will be a str instance
assert obj.non_strict == 'arbitrary'
constrained
¶
By default all strict EnumField
are constrained
. This means that
CheckConstraints will be generated at the database level
to ensure that the column will reject any value that is not present in the enumeration. This is a
good idea for most use cases, but it can be turned off by setting constrained
to False
.
Note
This is new in version 2.0. If you are upgrading from a previous version, you may set
this parameter to False
to maintain the previous behavior.
primitive
¶
EnumField
dynamically determines the database column type by
determining the most appropriate primitive type for the enumeration based on the enumeration
values. You may override the primitive determined by EnumField
by
passing a type to the primitive
parameter. You will likely not need to do this unless your
enumeration is eccentric in some way.
coerce
¶
Setting this parameter to False
will turn off the automatic conversion to
the field’s Enum
type while leaving all validation checks in place. It will
still be possible to set the field directly as an Enum
instance and to
filter by Enum
instance or any symmetric value:
non_strict = EnumField(
EnumType,
strict=False,
coerce=False,
# it might be necessary to override max_length also, otherwise
# max_length will be 1
max_length=10,
)
# set to a valid EnumType value
obj.non_strict = '1'
# when accessed will be the primitive value
assert obj.non_strict == '1'
assert isinstance(obj.non_strict, str)
assert not isinstance(obj.non_strict, NoCoerceExample.EnumType)