Как динамически создавать методы для моделей 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()?

Простите за плохой английский :(

)
Вернуться на верх