Django Custom Manager

时间:2011-08-25 15:55:56

标签: python django models django-custom-manager

我正在看一些代码,我很好奇这是不是很好的做法。

      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 个答案:

答案 0 :(得分:3)

使用模型管理器来包装复杂的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 :(得分:1)

我以前做过这个。它工作得很好。因此,除非您查看我的代码,否则世界上显然有两个人认为这很有用。

它不是替代来覆盖get_query_set - 它提供了其他获取(过滤)实例的方法。你可以同时做(两者兼而有之)。

你期待什么问题?

PS此方法也用于Pro Django,第274页以及使用most_recent()等方法扩展管理器。