我正在尝试开发一种自定义方式来实现Django模型的选择。我为选择和自定义字段设计了一个类,如下所示:
class Choices:
def __init__(self, *keys):
self._keys = list(keys)
def __getattr__(self, key):
return self._keys.index(key)
def __getitem__(self, index):
return self._keys[index]
def as_choices_list(self):
return list(enumerate(self._keys))
class ChoicesField(models.PositiveSmallIntegerField):
def __init__(self, *args, **kwargs):
if isinstance(kwargs['choices'], Choices):
kwargs['choices'] = kwargs['choices'].as_choices_list()
super().__init__(*args, **kwargs)
我的测试模型是:
class MyModel(models.Model):
TYPES = Choices('a', 'b', 'c')
type = ChoicesField(choices=TYPES, default=TYPES.a)
当我尝试进行迁移时,出现错误:
ValueError: 'contribute_to_class' is not in list
看来我需要在类Choices
中添加一些特殊的实现,以使Django将其视为非字段。
解决我的问题的最佳方法是什么?
我正在使用Django 2.2和Python 3.7。