Где должны быть размещены пользовательские функции запроса?

#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()