{"id":9670,"library":"django-enumfields","title":"django-enumfields","description":"django-enumfields provides robust integration of Python's `enum.Enum` types with Django models, forms, and REST Framework serializers. It's currently at version 2.1.1 and follows a moderate release cadence, primarily focusing on Django and Python version compatibility and bug fixes.","status":"active","version":"2.1.1","language":"en","source_language":"en","source_url":"https://github.com/hzdg/django-enumfields","tags":["django","enum","orm","models","forms","restframework"],"install":[{"cmd":"pip install django-enumfields","lang":"bash","label":"Install stable version"}],"dependencies":[{"reason":"Core functionality is built on Django's ORM.","package":"Django","optional":false},{"reason":"Provides EnumField serializer support for DRF.","package":"djangorestframework","optional":true}],"imports":[{"note":"The primary field type for enum instances.","symbol":"EnumField","correct":"from enumfields import EnumField"},{"note":"Stores enum values as integers in the database.","symbol":"EnumIntegerField","correct":"from enumfields import EnumIntegerField"},{"note":"Stores enum values as strings in the database. Requires `max_length`.","symbol":"EnumCharField","correct":"from enumfields import EnumCharField"}],"quickstart":{"code":"import enum\nfrom django.db import models\nfrom enumfields import EnumField, EnumIntegerField, EnumCharField\n\nclass MyEnum(enum.Enum):\n    FIRST = 1\n    SECOND = 2\n    THIRD = 3\n\nclass MyCharEnum(enum.Enum):\n    FOO = 'foo'\n    BAR = 'bar'\n\nclass MyModel(models.Model):\n    # Stores the enum value as its internal integer value\n    my_int_field = EnumIntegerField(MyEnum, default=MyEnum.FIRST)\n    \n    # Stores the enum value as its internal value (can be mixed types)\n    my_field = EnumField(MyEnum, default=MyEnum.FIRST)\n    \n    # Stores the enum value as a string (requires max_length)\n    my_char_field = EnumCharField(MyCharEnum, max_length=10, default=MyCharEnum.FOO)\n\n    def __str__(self):\n        return f'{self.my_int_field.name} - {self.my_char_field.value}'\n\n# Example usage:\n# instance = MyModel.objects.create(my_int_field=MyEnum.SECOND, my_char_field=MyCharEnum.BAR)\n# print(instance.my_int_field) # MyEnum.SECOND\n# print(instance.my_int_field.value) # 2\n# print(instance.my_char_field.name) # FOO","lang":"python","description":"Define Python `enum.Enum` classes and use `EnumField`, `EnumIntegerField`, or `EnumCharField` in your Django models. The field stores the enum's value in the database and retrieves it as the enum instance."},"warnings":[{"fix":"Upgrade Python to 3.7+ and Django to 2.1+ before upgrading `django-enumfields` to 2.0.0 or later.","message":"Version 2.0.0 dropped support for Python 2.7, 3.4 and Django 1.8, 1.10. Ensure your project meets the new minimum requirements.","severity":"breaking","affected_versions":"<2.0.0"},{"fix":"Upgrade Django to 2.2, 3.0, 3.1 or newer. If not possible, pin `django-enumfields<2.1.0`.","message":"Version 2.1.0 dropped support for Django 2.0 and 2.1. Projects on these Django versions must upgrade Django or stick to older `django-enumfields` versions.","severity":"breaking","affected_versions":">=2.1.0"},{"fix":"Immediately upgrade to `django-enumfields==2.1.1` or newer to fix the string conversion issue.","message":"A regression in version 2.1.0 mistakenly broke string-to-enum conversion, potentially causing `ValueError` or incorrect data when loading models or deserializing data where string values were expected.","severity":"gotcha","affected_versions":"2.1.0"},{"fix":"Always specify `max_length` when using `EnumCharField`, e.g., `EnumCharField(MyCharEnum, max_length=10)`.","message":"`EnumCharField` requires `max_length` just like a standard Django `CharField`. Forgetting it will result in `FieldError` or `SystemCheckError`.","severity":"gotcha","affected_versions":"all"}],"env_vars":null,"last_verified":"2026-04-17T00:00:00.000Z","next_check":"2026-07-16T00:00:00.000Z","problems":[{"fix":"Assign an `enum.Enum` member directly, e.g., `model_instance.my_field = MyEnum.FIRST`. If dealing with string input, convert it to an enum member first, e.g., `MyEnum[input_string.upper()]` or `MyEnum(int(input_string))`.","cause":"Attempting to assign a raw string or an invalid value directly to an `EnumField` or `EnumIntegerField` instance. These fields expect an actual `enum.Enum` member.","error":"ValueError: Field 'my_field' does not allow value 'some_string_value'."},{"fix":"Ensure the form input for enum fields precisely matches either the `.name` or `.value` of a valid `enum.Enum` member defined for that field.","cause":"Submitting a form with a value for an EnumField that does not correspond to any valid enum member's name or value.","error":"django.core.exceptions.ValidationError: ['Enter a valid value.']"},{"fix":"If the field can be null, define it with `null=True` (e.g., `EnumField(MyEnum, null=True)`). When accessing, always check for `None` first: `if instance.my_field: print(instance.my_field.name)`.","cause":"Accessing `.name` or `.value` on an `EnumField` instance when its value is `None` (i.e., the database field is null and the field is not set).","error":"AttributeError: 'NoneType' object has no attribute 'name'"}]}