Django Custom Manager - PullRequest
       28

Django Custom Manager

0 голосов
/ 25 августа 2011

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

      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 ]

3 голосов
/ 25 августа 2011

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

1 голос
/ 25 августа 2011

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

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

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

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

...