Прямое использование Django Managers и staticmethod в классе Model - PullRequest
25 голосов
/ 08 октября 2011

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

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

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

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

1 Ответ

32 голосов
/ 08 октября 2011

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

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

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

Однако, если вы пишете приложение, которым вы хотите поделиться с другими пользователями 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...