【问题标题】:Django Custom ManagerDjango 自定义管理器
【发布时间】:2011-08-25 15:55:55
【问题描述】:

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

      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(释义)方法。这是处理事情的好方法吗?

【问题讨论】:

    标签: python django models django-custom-manager


    【解决方案1】:

    使用模型管理器来包装复杂的 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 上找到。

    【讨论】:

      【解决方案2】:

      我以前做过。它工作得很好。所以除非你在看我的代码,否则世界上显然有两个人觉得这很有用。

      这不是覆盖get_query_set替代方法 - 它提供了其他 方法来获取(过滤的)实例。你可以同时做这两件事(在合理的范围内)。

      你期待什么问题?

      PS 这种方法也用在 Pro Django 中,第 274 页开始,其中使用 most_recent() 之类的方法扩展了 Manager。

      【讨论】:

      • 是的,我希望像 Model.objects.scheduled() 这样的方法链。对吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 2011-04-20
      相关资源
      最近更新 更多