Добавление пользовательских запросов к менеджерам является соглашением Django. Из документации Django о пользовательских менеджерах :
Добавление дополнительных методов Manager является предпочтительным способом добавления функциональности «на уровне таблицы» в ваши модели.
Если это ваше личное приложение, слово соглашения не имеет большого значения - действительно, внутренняя кодовая база моей компании имеет несколько методов класса, которые, возможно, принадлежат пользовательскому менеджеру.
Однако, если вы пишете приложение, которым вы хотите поделиться с другими пользователями Django, они ожидают увидеть findBy
в специальном менеджере.
Я не думаю, что проблемы наследования, о которых вы говорите, слишком плохи. Если вы прочитаете пользовательские менеджеры и документы по наследованию моделей , я не думаю, что вы пойманы. Многословие написания .objects
терпимо, как и при выполнении запросов с использованием XYZ.objects.get()
и XYZ.objects.all()
Вот несколько преимуществ использования методов менеджера на мой взгляд:
Согласованность API. Ваш метод findBy
относится к get
, filter
, aggregate
и остальным. Хотите знать, какие поиски вы можете сделать на менеджере XYZ.objects
? Это просто, когда вы можете самоанализ с dir(XYZ.objects)
.
Статические методы "загромождают" пространство имен экземпляра. XYZ.findBy()
хорошо, но если вы определите статический метод, вы также можете сделать xyz.findBy()
. Запуск поиска findBy
для конкретного экземпляра не имеет смысла.
Сухость. Иногда вы можете использовать один и тот же менеджер на нескольких моделях.
Сказав все это, решать вам. Я не знаю причину, по которой вы не должны использовать статический метод. Вы взрослый человек, это ваш код, и если вы не хотите писать findBy
в качестве метода менеджера, небо не упадет;)
Для дальнейшего чтения я рекомендую пост в блоге Менеджеры против методов класса Джеймсом Беннеттом, менеджером релизов Django.