Подтвердить что ты не робот

Использование Django Managers против staticmethod в классе модели напрямую

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

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

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

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

4b9b3361

Ответ 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.