Ответ 1
Добавление пользовательских запросов к менеджерам - это соглашение Django. Из документов Django в пользовательских менеджерах:
Добавление дополнительных методов Менеджера - это предпочтительный способ добавления функциональности "на уровне таблицы" к вашим моделям.
Если это ваше собственное частное приложение, слово конвенции не имеет большого значения - на самом деле моя внутренняя кодовая база моей компании имеет несколько методов класса, которые, возможно, принадлежат к настраиваемому диспетчеру.
Однако, если вы пишете приложение, которое собираетесь делиться с другими пользователями 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.