This package lets you use real Python (PEP435-style) enums with Django.
pip install django-enumfields
from enumfields import EnumField
from enum import Enum # Uses Ethan Furman's "enum34" backport
class MyModel(models.Model):
class Color(Enum):
RED = 'r'
GREEN = 'g'
BLUE = 'b'
color = EnumField(Color, max_length=1)
Elsewhere:
m = MyModel.objects.filter(color=MyModel.Color.RED)
EnumIntegerField
works identically, but the underlying storage mechanism is
an IntegerField
instead of a CharField
.
Normally, you just use normal PEP435-style enums, however, django-enumfields also encludes its own version of Enum with a few extra bells and whistles. Namely, the smart definition of labels which are used, for example, in admin dropdowns. By default, it will create labels by title-casing your constant names. You can provide custom labels with a nested "Labels" class.
from enumfields import EnumField, Enum # Our own Enum class
class MyModel(models.Model):
class Color(Enum):
RED = 'r'
GREEN = 'g'
BLUE = 'b'
class Labels:
RED = 'A custom label'
color = EnumField(Color, max_length=1)
assert MyModel.Color.GREEN.label == 'Green'
assert MyModel.Color.RED.label == 'A custom label'