Как динамически создавать методы для моделей Django?
Я изучаю Python уже несколько месяцев и впервые зашел в тупик. У меня есть пример Django такого кода:
class SomeOptions(models.Model):
FIRST = 1
SECOND = 2
THIRD = 3
@classmethod
def get_first(cls):
return SomeOptions.objects.get(pk=cls.FIRST)
@classmethod
def get_second(cls):
return SomeOptions.objects.get(pk=cls.SECOND)
@classmethod
def get_third(cls):
return SomeOptions.objects.get(pk=cls.THIRD)
Выглядит отвратительно. Но работает именно так, как я хочу.
SomeOptions.get_first()
>> 'Some data from db'
Я хочу удалить эти методы и сделать так, чтобы они генерировались динамически. Мне даже удалось сделать это таким образом:
class Dispatcher(object):
def __init__(self, model, method_name):
self.model = model
self.method_name = method_name
def __call__(self):
return self.get_required_attribute_value()
def get_required_attribute_value(self):
required_attribute_name = self.get_required_attribute_name()
required_attribute_value = getattr(self.model, required_attribute_name)
value_from_database = self.model.objects.get(pk=required_attribute_value)
return value_from_database
def get_required_attribute_name(self):
_, required_attribute_name = self.method_name.split('_')
return required_attribute_name.upper()
class SomeOptions(models.Model):
FIRST = 1
SECOND = 2
THIRD = 3
@classmethod
def __getattr__(cls, attr):
return Dispatcher(cls, attr)
У меня есть еще код, но самое главное, что класс Dispatcher является универсальным и может быть использован для любой модели.
Проблема заключается в следующем:
SomeOptions().get_first()
>> 'Some data from db'
SomeOptions.get_first()
>> AttributeError: type object 'SomeOptions' has no attribute 'get_first'
Как заставить код работать без создания объекта SomeOptions()?
Простите за плохой английский :(
)