У меня есть модель Django, где доступно множество полей. Поэтому мне пришлось написать много свойств «is_something» этого класса, чтобы проверить, равно ли значение экземпляра некоторому значению выбора. Что-то вдоль линий:Динамически добавлять свойства к модели django
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)
Теперь, это работает, но у меня есть чувство, что есть лучшее способ сделать это. Возможно, во время создания класса (с метаклассами или в методе )? У вас есть какие-то мысли/предложения по этому поводу?
Варианты выбора для каждого поля. Вы имеете в виду создание новой модели вместо каждого поля, которое содержит выбор? Разве это не будет излишним с точки зрения выступлений? – mp85
Такое поведение можно моделировать, возможно, проще. Overkill? да и нет, это действительно зависит от многих вещей. – Wtower
Спасибо, это интересный подход, я должен, вероятно, прочитать об этом. Можете ли вы указать мне на любой ресурс, где этот шаблон более подробно объясняется? – mp85