Джанго Кастом Менеджер

Я смотрю на некоторый код, и мне любопытно, является ли это хорошей практикой.

      class ToDoManager(models.Manager):
          def scheduled(self):
          """
          Returns QuerySet of all things to be done.
          """
          return self.filter(...)


      class ImpStuff(models.Model):
          ....model definition

          objects=TodoManager    

Я всегда видел, чтобы пользовательский менеджер переопределил метод get_query_set (перефразируя). Это хороший способ справиться с ситуацией?

2 ответа

Решение

Я делал это раньше. это работало нормально. так что, если вы не посмотрите на мой код, очевидно, что в мире есть два человека, которые находят это полезным.

это не альтернатива переопределению get_query_set - предоставляет дополнительные способы получения (отфильтрованных) экземпляров. Вы можете сделать оба одновременно (в пределах разумного).

какие проблемы вы ожидаете?

PS этот подход также используется в Pro Django, стр. 274 и далее, где менеджер расширяется такими методами, как most_recent(),

Использование менеджеров моделей для упаковки сложных запросов ORM является чем-то очень СУХИМЫМ и рекомендуется. Вы можете добавить параметры к этим методам и сэкономить много кода:

class ToDoManager(models.Manager):
      def scheduled(self, start_date, end_date):
      """
      Returns tasks to be done within two dates.
      """
      return self.filter(...)

Тогда вы просто делаете:

todo_tasks = ImpStuff.objects.scheduled(datetime.now(), datetime.datetime.now() + datetime.timedelta(3))

Менеджеры используются во многих приложениях Django с открытым исходным кодом, доступных на Github.

Другие вопросы по тегам