Где следует размещать пользовательские функции запросов? - PullRequest
0 голосов
/ 11 ноября 2011

В приложении Django несколько представлений могут содержать похожие запросы БД. Например, запрос для всех объектов, где is_active = True и is_online = True. Во время рефакторинга такие повторяющиеся вызовы необходимо переместить в функцию, и вопрос заключается в том, где лучше разместить эту функцию фильтра / запроса.

1) В определение класса / сущности? Но должен ли объект «знать» о своих собственных методах фильтрации? Это кажется типичным решением, но может быть не очень хорошим дизайном, так как выбор ощущается как функция, внешняя по отношению к объекту. С другой стороны, такие методы внутри объекта не создают побочных эффектов и кажутся довольно безопасными. 2) В какой-то модуль / пространство имен, занимающееся фильтрацией, например, filter.Users, filter.Entities? Или где-то еще?

Какая лучшая практика?

1 Ответ

3 голосов
/ 11 ноября 2011

Это как раз то, для чего нужны менеджеры моделей .

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...