管理器(manage)是提供给 Django 应用程序的数据库查询操作的接口. Django 应用程序中的每个 model 至少有一个管理器对象.
Django 默认自动给每个 model 添加一个名为 objects 的管理器.不过如果你需要用 objects 作为一个字段名的话, 或者你不愿意使用 objects 这个名字, 也允许为 model 指定自定义名字. 若在 model 中定义一个 models.Manager() 类型的属性, 则该属性就是管理器对象:
from django.db import models class Person(models.Model): ... people = models.Manager()
在这个例子里, Person.objects.all() 会引发异常,而 Person.people.all() 会提供一个所有 Person 对象。
Book.objects.all()中objetcs就是一个Manager的例子。那么什么时候需要定制自己的manager呢?
假如对于Person.objects.get()我们想先通过memcached get数据,如果cache里面有没有,再从数据库里面查询数据那么可以定制person的manage:
class CacheBaseManager(models.Manager): def get(self, *arg, **kwargs): id = kwargs.get("id", 0) uid = kwargs.get("user__id", 0) or kwargs.get("user__id__exact", 0) key = id and cf.generate_cache_key(id, self.model) or \ uid and cf.generate_cache_key("uid:%s" % uid, self.model) model = key and cache.get(key) # 通过id查询先从缓存里面获取 if not model: model = super(CacheBaseManager, self).get(*arg, **kwargs) cache.set(key, model, 60*60) else: if dir(self.model()) != dir(model): model = super(CacheBaseManager, self).get(*arg, **kwargs) cache.set(key, model, 60*60) logging.debug("cache hit >> [%s]" % key) return model