Как сделать модели django с большим количеством функций-членов более управляемыми?

У меня огромная модель из-за множества функций-членов. Я хотел бы разделить функции на отдельные классы по их назначению, чтобы все было более упорядочено.

Использование OneToOneField не является для меня хорошим вариантом, поскольку мое приложение сильно зависит от кэширования запросов (с помощью cacheops). И я заметил, что получение последней версии объекта данных (из db) может быть привязано к устаревшему OneToOneField (из кэша). Кроме того, количество членов данных не является проблемой, только количество функций-членов. Поэтому я бы предпочел использовать только одну модель данных.

Например, я могу сделать это следующим образом:

# models.py
class MyModel(models.Model):
    # members

# separate member functions
class CustomModelFunctions:
    @staticmethod
    def some_function(my_model_instance):
        # logic

# call the function on the my_model obj 
#  instead of calling my_model.some_function()
CustomModelFunctions.some_function(my_model)

Это работает, но проблема в том, что эти функции нельзя использовать в шаблонах django, так как аргумент my_model не может быть передан. Например, я не понимаю, как я могу заменить следующий код шаблона:

{% if my_model.some_function %}

Кто-нибудь знает обходной путь для этого? Или другой подход к организации моделей с большим количеством функций-членов?

У меня огромная модель из-за множества функций-членов. Я хотел бы разделить функции на отдельные классы в соответствии с их назначением, чтобы все было более организованно.

Вероятно, лучшим способом будет работа с прокси, например:

class FunctionCategory(type):
    def __get__(self, obj, objtype=None):
        return self(obj)


class FunctionCategoryBase(metaclass=FunctionCategory):
    def __init__(self, obj):
        self.obj = obj


# separate member functions
class FunctionCategory1(FunctionCategoryBase):
    def some_function11(self):
        # use self.obj
        return None

    def some_function12(self):
        # use self.obj
        return None


# separate member functions
class FunctionCategory2(FunctionCategoryBase):
    def some_function21(self):
        # use self.obj
        return None

    def some_function22(self):
        # use self.obj
        return None

    def some_function23(self):
        # use self.obj
        return None


class MyModel(models.Model):
    # members
    functions1 = FunctionCategory1
    functions2 = FunctionCategory2

Тогда вы можете использовать:

my_model_object.functions1.some_function12()

Таким образом, для my_model_object.functions1 создается FunctionCategory1, куда внедряется объект модели.

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