Как сделать модели 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
, куда внедряется объект модели.