A custom Django field able to use subclasses of Python's internal `Enum` class as choices
Project description
django-enum-choices
Library is still work in progress & unstable. When officially launched, we'll announce it.
A custom Django choice field to use with Python enums.
Installation
pip install django_enum_choices
Basic Usage
from django import models
from django_enum_choices.fields import EnumChoiceField
from enum import Enum
class FooBarEnumeration(Enum):
FOO = 'foo'
BAR = 'bar'
class MyModel(models.Model):
foo_bar_field = EnumChoiceField(FooBarEnumeration)
Model creation
instance = MyModel.objects.create(foo_bar_field=FooBarEnumeration.BAR)
Changing enum values
instance.foo_bar_field = FooBarEnumeration.FOO
instance.save()
Filtering
MyModel.objects.filter(foo_bar_field=FooBarEnumeration.FOO)
Usage with Django Rest Framework
from rest_framework import serializers
from django_enum_choices.serializers import EnumChoiceField
class MyModelSerializer(serializers.ModelSerializer):
foo_bar_field = EnumChoiceField(FooBarEnumeration)
class Meta:
model = MyModel
fields = ('foo_bar_field', )
In python manage.py shell
:
In [1]: instance = MyModel.objects.create(foo_bar_field=FooBarEnumeration.BAR)
In [2]: MyModelSerializer(instance).data
Out[2]: {'foo_bar_field': 'bar'}
Caveat
If you don't explicitly specify the foo_bar_field = EnumChoiceField(FooBarEnumeration)
, then you need to include the EnumChoiceModelSerializerMixin
:
from rest_framework import serializers
from django_enum_choices.serializers import EnumChoiceModelSerializerMixin
class MyModelSerializer(EnumChoiceModelSerializerMixin, serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ('foo_bar_field', )
By default ModelSerializer.build_standard_field
coerces any field that has a model field with choices to ChoiceField
wich returns the value directly.
Since enum values resemble EnumClass.ENUM_INSTANCE
they won't be able to be encoded by the JSONEncoder
when being passed to a Response
.
That's why we need the mixin.
Implementation details
EnumChoiceField
is a subclass ofCharField
.- Only subclasses of
Enum
are valid arguments forEnumChoiceField
. choices
are generated from the values of the enumeration, like(str(value), str(value))
, meaning you can put any valid Python object there.max_length
, if passed, is ignored.max_length
is automatically calculated from the longest choice.
For example, lets have the following case:
class Value:
def __init__(self, value):
self.value = value
def __str__(self):
return str(self.value)
class Enumeration(Enum):
A = Value(1)
B = Value('foo')
class SomeModel(models.Model):
enumeration = EnumChoiceField(Enumeration)
We'll have the following:
SomeModel.enumeration.choices == (('1', '1'), ('foo', 'foo'))
SomeModel.enumeration.max_length == 3
Development
git clone https://github.com/HackSoftware/django-enum-choices.git
pip install -e some-directory/django_enum_choices
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for django_enum_choices-0.0.7.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 65ff7f952203e24741ab3341707722850c503734bf5e1d0becdf4a221b1210d7 |
|
MD5 | e41e66e09cc392dd185d664417728169 |
|
BLAKE2b-256 | 2396f195b704562fc63fa78d9c7e8ba8f359c6aaeae0cc2059dabcecaa10e8de |
Hashes for django_enum_choices-0.0.7-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 848543a5105a0844e55c17af19b3c65e693f781f3279fe44f2edba848e0911f7 |
|
MD5 | 8a2c215f673ea241fa330d4097701581 |
|
BLAKE2b-256 | 34224a7b8cd98b7f39a1d95e0fd3e6f77db839c97543e0cac20e515f41b3e1fc |