Прямое использование менеджеров Django против staticmethod в классе модели

#python #django

#python #django

Вопрос:

Прочитав о менеджерах Django, я все еще не уверен, какую пользу я получу от его использования. Кажется, что лучше всего использовать для добавления пользовательских запросов (только для чтения) методы, такие как XYZ.objects.findBy*() . Но я могу легко сделать это со статическими методами вне самих Model классов.

Я всегда предпочитаю последнее, потому что:

  1. локальность кода с точки зрения удобства чтения и упрощения обслуживания
  2. немного менее подробный, поскольку мне не нужно objects свойство в моих вызовах
  3. Manager классы имеют странные правила, касающиеся наследования модели, также могут держаться подальше от этого.

Есть ли веская причина не использовать статические методы и вместо этого использовать классы менеджеров?

Ответ №1:

Добавление пользовательских запросов к менеджерам — это соглашение Django. Из документации Django по пользовательским менеджерам:

Добавление дополнительных методов менеджера является предпочтительным способом добавления функциональности «на уровне таблиц» в ваши модели.

Если это ваше собственное частное приложение, условное слово не имеет большого значения — действительно, во внутренней кодовой базе моей компании есть несколько методов classmethod, которые, возможно, принадлежат пользовательскому менеджеру.

Однако, если вы пишете приложение, которым собираетесь поделиться с другими пользователями Django, они будут ожидать увидеть findBy его в пользовательском менеджере.

Я не думаю, что проблемы наследования, о которых вы упоминаете, слишком плохи. Если вы прочитаете пользовательские менеджеры и документы по наследованию моделей, я не думаю, что вас поймают. Подробное написание .objects терпимо, так же, как и при выполнении запросов с использованием XYZ.objects.get() и XYZ.objects.all()

На мой взгляд, вот несколько преимуществ использования методов менеджера:

  1. Согласованность API. Ваш метод findBy принадлежит get , filter , aggregate и остальным. Хотите знать, какие запросы вы можете выполнять в XYZ.objects менеджере? Это просто, когда вы можете анализировать с dir(XYZ.objects) помощью .

  2. Статические методы «загромождают» пространство имен экземпляра. XYZ.findBy() это нормально, но если вы определяете статический метод, вы также можете сделать xyz.findBy() . Выполнение findBy поиска в конкретном экземпляре на самом деле не имеет смысла.

  3. Сухость. Иногда вы можете использовать один и тот же менеджер для нескольких моделей.

Сказав все это, это зависит от вас. Я не знаю убийственной причины, по которой вам не следует использовать статический метод. Вы взрослый человек, это ваш код, и если вы не хотите писать findBy как метод менеджера, небо не упадет 😉

Для дальнейшего чтения я рекомендую статью Джеймса Беннетта, менеджера релизов Django, «Менеджеры сообщений против методов классов«.

Комментарии:

1. Интересно, может ли кто-нибудь уточнить, почему менеджер моделей предпочтительнее для инициализации модели? Я «понимаю», что у меня есть один для дополнительных методов, но только для построения он кажется раздутым…

2. @GreenAsJade для инициализации модели установка метода в менеджере согласуется с существующим XYZ.objects.create() методом. Я думаю, что мои пункты 2 и 3 выше по-прежнему применимы. Сказав это, вы взрослый человек. Если вы хотите поместить свой метод инициализации в модель, тогда сделайте это, если это работает для вас / вашей команды.