Skip to main content

Full and natural support for enumerations as Django model fields.

Project description

MIT license PyPI version fury.io PyPI pyversions PyPI status Documentation Status Code Cov Test Status

Django Enum

Full and natural support for enumerations as Django model fields.

django-enum works in concert with Django’s built in TextChoices and IntegerChoices to provide a new model field type, EnumField, that resolves the correct native Django field type for the given enumeration based on its value type and range. For example, IntegerChoices that contain values between 0 and 32767 become PositiveSmallIntegerField.

from django.db import models
from django_enum import EnumField

class MyModel(models.Model):

    class TextEnum(models.TextChoices):

        VALUE0 = 'V0', 'Value 0'
        VALUE1 = 'V1', 'Value 1'
        VALUE2 = 'V2', 'Value 2'

    class IntEnum(models.IntegerChoices):

        ONE   = 1, 'One'
        TWO   = 2, 'Two',
        THREE = 3, 'Three'

    # this is equivalent to:
    #  CharField(max_length=2, choices=TextEnum.choices, null=True, blank=True)
    txt_enum = EnumField(TextEnum, null=True, blank=True)

    # this is equivalent to
    #  PositiveSmallIntegerField(choices=IntEnum.choices)
    int_enum = EnumField(IntEnum)

EnumField is more than just an alias. The fields are now assignable and accessible as their enumeration type rather than by-value:

instance = MyModel.objects.create(
    txt_enum=MyModel.TextEnum.VALUE1,
    int_enum=3  # by-value assignment also works
)
instance.refresh_from_db()

assert instance.txt_enum == MyModel.TextEnum('V1')
assert instance.txt_enum.label == 'Value 1'

assert instance.int_enum == MyModel.IntEnum['THREE']
assert instance.int_enum.value == 3

django-enum also provides IntegerChoices and TextChoices types that extend from enum-properties which makes possible very rich enumeration fields.

from enum_properties import s
from django_enum import TextChoices  # use instead of Django's TextChoices
from django.db import models

class TextChoicesExample(models.Model):

    class Color(TextChoices, s('rgb'), s('hex', case_fold=True)):

        # name   value   label       rgb       hex
        RED     = 'R',   'Red',   (1, 0, 0), 'ff0000'
        GREEN   = 'G',   'Green', (0, 1, 0), '00ff00'
        BLUE    = 'B',   'Blue',  (0, 0, 1), '0000ff'

        # any named s() values in the Enum's inheritance become properties on
        # each value, and the enumeration value may be instantiated from the
        # property's value

    color = EnumField(Color)

instance = TextChoicesExample.objects.create(
    color=TextChoicesExample.Color('FF0000')
)
assert instance.color == TextChoicesExample.Color('Red')
assert instance.color == TextChoicesExample.Color('R')
assert instance.color == TextChoicesExample.Color((1, 0, 0))

# direct comparison to any symmetric value also works
assert instance.color == 'Red'
assert instance.color == 'R'
assert instance.color == (1, 0, 0)

# save by any symmetric value
instance.color = 'FF0000'
instance.full_clean()

# access any enum property right from the model field
assert instance.color.hex == 'ff0000'

# this also works!
assert instance.color == 'ff0000'

# and so does this!
assert instance.color == 'FF0000'

instance.save()

# filtering works by any symmetric value or enum type instance
assert TextChoicesExample.objects.filter(
    color=TextChoicesExample.Color.RED
).first() == instance

assert TextChoicesExample.objects.filter(color=(1, 0, 0)).first() == instance

assert TextChoicesExample.objects.filter(color='FF0000').first() == instance

Please report bugs and discuss features on the issues page.

Contributions are encouraged!

Full documentation at read the docs.

Installation

  1. Clone django-enum from GitHub or install a release off PyPI :

pip install django-enum

Integrations are provided that leverage enum-properties to make enumerations do more work and to provide extended functionality for django-filter and djangorestframework.

pip install enum-properties
pip install django-filter
pip install djangorestframework

If features are utilized that require a missing optional dependency an exception will be thrown.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-enum-1.0.0.tar.gz (14.1 kB view details)

Uploaded Source

Built Distribution

django_enum-1.0.0-py3-none-any.whl (14.2 kB view details)

Uploaded Python 3

File details

Details for the file django-enum-1.0.0.tar.gz.

File metadata

  • Download URL: django-enum-1.0.0.tar.gz
  • Upload date:
  • Size: 14.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.7.12 Darwin/21.4.0

File hashes

Hashes for django-enum-1.0.0.tar.gz
Algorithm Hash digest
SHA256 4e1270c1c1801f27e5dcf41389757bb2f49e80d595373b40d29fc146a235daad
MD5 7b5eb5fdcff880e8883959a6aebd0ff4
BLAKE2b-256 ac228c1a6d6f9b6b8aedbc7f505e8c587657e92ee752361dafc7c0d3ac6d90d7

See more details on using hashes here.

File details

Details for the file django_enum-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: django_enum-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 14.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.7.12 Darwin/21.4.0

File hashes

Hashes for django_enum-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8bae9111af2d7ac68305c74d3ad1229553f4c96a6d757e3dc33556b6bd8c7358
MD5 f93f6e4d218e3248fae1822af3aac826
BLAKE2b-256 6014b037d1657c2565d3da20306c820d3afcab12713fdfafebb96df8f2b847f2

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page