【发布时间】:2015-08-28 09:15:07
【问题描述】:
我有一个 Django 模型,其中有很多字段可供选择。所以我不得不写了很多类的“is_something”属性来检查实例值是否等于某个选择值。大致如下:
class MyModel(models.Model):
some_choicefield = models.IntegerField(choices=SOME_CHOICES)
@property
def is_some_value(self):
return self.some_choicefield == SOME_CHOICES.SOME_CHOICE_VALUE
# a lot of these...
为了自动执行此操作并节省大量冗余代码,我考虑在创建实例时修补实例,并使用一个添加一堆执行检查的方法的函数。 代码如下(我假设有一个“规范化”函数使选项标签成为可用的函数名称):
def dynamic_add_checks(instance, field):
if hasattr(field, 'choices'):
choices = getattr(field, 'choices')
for (value,label) in choices:
def fun(instance):
return getattr(instance, field.name) == value
normalized_func_name = "is_%s_%s" % (field.name, normalize(label))
setattr(instance, normalized_func_name, fun(instance))
class MyModel(models.Model):
def __init__(self, *args, **kwargs):
super(MyModel).__init__(*args, **kwargs)
dynamic_add_checks(self, self._meta.get_field('some_choicefield')
some_choicefield = models.IntegerField(choices=SOME_CHOICES)
现在,这可行,但我觉得有更好的方法来做到这一点。也许在类创建时(使用元类或在 new 方法中)?您对此有什么想法/建议吗?
【问题讨论】:
标签: python django django-models metaclass