У меня также есть сценарий использования для моделей Enum на основе базы данных. Я предложил решение, использующее дескрипторы Python для реализации django choices -подобного интерфейса со значениями перечисления:
from django.db import models
class ModelInstance:
"""Descriptor that uses predefined value fields to access model instances."""
def __init__(self, **kwargs):
self._instance_attributes = kwargs
self._instance = None
def __get__(self, instance, instance_type):
if not self._instance:
self._instance = instance_type.objects.get(**self._instance_attributes)
return self._instance
class EnumModel(models.Model):
name = models.CharField(max_length=100)
JOHN = ModelInstance(name='John')
FRED = ModelInstance(name='Fred')
JOHN
и FRED
- это лениво оцененные экземпляры модели, полученные для определенных параметров запроса (name=value
). Я предполагаю, что запросы оцениваются по уникальным строкам в таблице.
Чтобы использовать его, сначала нужно добавить строки в базу данных для Джона и Фреда:
In [1]: EnumModel.objects.create(name="Fred")
In [2]: EnumModel.objects.create(name="John")
Затем вы можете получить доступ к экземплярам модели, используя атрибуты класса:
In [3]: EnumModel.JOHN
Out[3]: <EnumModel: EnumModel object (1)>
In [4]: EnumModel.FRED
Out[4]: <EnumModel: EnumModel object (2)>