Django自定义管理器
我在看一些代码,想知道这样做是不是好习惯。
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
使用模型管理器来处理复杂的数据库查询是一种很好的做法,这样可以让代码更简洁,也更容易维护。你可以在这些方法中添加参数,这样可以省去很多重复的代码:
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
我之前做过这个,效果很好。所以除非你在看我的代码,否则似乎全世界只有两个人觉得这个有用。
这并不是对 get_query_set
的一种“替代”方法,而是提供了获取(过滤后)实例的“额外”方式。你可以同时使用这两种方法(在合理的范围内)。
你预期会遇到什么问题呢?
顺便说一下,这种方法在《Pro Django》一书的第274页及之后的部分也有提到,书中讲到如何扩展一个管理器,增加像 most_recent()
这样的功能。