#python #django #oop #orm
#python #django #ооп #orm
Вопрос:
В приложении Django несколько представлений могут содержать похожие запросы к БД. Например, запрос для всех объектов, где is_active = True и is_online = True. Во время рефакторинга такие повторяющиеся вызовы необходимо переместить в функцию, и вопрос в том, где лучше разместить эту функцию фильтра / запроса.
1) В определение класса / сущности? Но должен ли объект «знать» о своих собственных методах фильтрации? Это кажется типичным решением, но может быть не очень хорошим дизайном, поскольку выделение воспринимается как функция, внешняя по отношению к объекту. С другой стороны, такие методы внутри object не создают побочных эффектов и кажутся довольно безопасными. 2) В какой-либо модуль / пространство имен, связанное с фильтрацией, например filter.Пользователи, фильтр.Сущности? Или где-то еще?
Какова наилучшая практика?
Ответ №1:
Это именно то, для чего существуют менеджеры моделей.
class MyActiveManager(models.Manager):
def active(self):
return self.filter(is_active=True)
def online(self):
return self.filter(is_online=True)
class MyModel:
...
objects = MyActiveManager()
...
active_objects = MyModel.objects.active()
online_objects = MyModel.objects.online()