#python #django
#python #django
Вопрос:
Прочитав о менеджерах Django, я все еще не уверен, какую пользу я получу от его использования. Кажется, что лучше всего использовать для добавления пользовательских запросов (только для чтения) методы, такие как XYZ.objects.findBy*()
. Но я могу легко сделать это со статическими методами вне самих Model
классов.
Я всегда предпочитаю последнее, потому что:
- локальность кода с точки зрения удобства чтения и упрощения обслуживания
- немного менее подробный, поскольку мне не нужно
objects
свойство в моих вызовах Manager
классы имеют странные правила, касающиеся наследования модели, также могут держаться подальше от этого.
Есть ли веская причина не использовать статические методы и вместо этого использовать классы менеджеров?
Ответ №1:
Добавление пользовательских запросов к менеджерам — это соглашение Django. Из документации Django по пользовательским менеджерам:
Добавление дополнительных методов менеджера является предпочтительным способом добавления функциональности «на уровне таблиц» в ваши модели.
Если это ваше собственное частное приложение, условное слово не имеет большого значения — действительно, во внутренней кодовой базе моей компании есть несколько методов classmethod, которые, возможно, принадлежат пользовательскому менеджеру.
Однако, если вы пишете приложение, которым собираетесь поделиться с другими пользователями 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, «Менеджеры сообщений против методов классов«.
Комментарии:
1. Интересно, может ли кто-нибудь уточнить, почему менеджер моделей предпочтительнее для инициализации модели? Я «понимаю», что у меня есть один для дополнительных методов, но только для построения он кажется раздутым…
2. @GreenAsJade для инициализации модели установка метода в менеджере согласуется с существующим
XYZ.objects.create()
методом. Я думаю, что мои пункты 2 и 3 выше по-прежнему применимы. Сказав это, вы взрослый человек. Если вы хотите поместить свой метод инициализации в модель, тогда сделайте это, если это работает для вас / вашей команды.