django Manager

管理器是提供给 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呢: to add extra manager methods, and/or
to modify the initial QuerySet the manager returns.

1)Adding Extra Manager Methods
例子:
给Book Model添加一个可以统计指定关键字个数的方法

class BookManager(models.Manager):
 def title_count(self,keyword):
  return self.filter(tille__icontains=keyword).count()

class Book(models.Model):
 tille = models.CharField(max_length=100)
 authors = models.ManyToManyField(Author)
 publisher = models.ForeignKey(Publisher)
 publication_date = models.DateField()
 objects = BookManager()
 
 def __unicode__(self):
  return self.tille
 
2)Modifying Initial Manager QuerySets
管理器默认的QuerySet返回表中的所有记录,如果有需要可以定制返回内容。
只需要重写Manager.get_query_set()就可以了。
举例:下面的model如果用dahl管理器则在使用Book.dahl_ojbects.all()时
只会返回所有yonggao写的书。

from django.db import models

# First, define the Manager subclass.
class DahlBookManager(models.Manager):
    def get_query_set(self):
        return super(DahlBookManager, self).get_query_set().filter(author='yonggao')

# Then hook it into the Book model explicitly.
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)
    # ...

    objects = models.Manager() # The default manager.
    dahl_objects = DahlBookManager() # The Dahl-specific manager.
   
上面例子的注意点:
当自己定义管理器时,请总要保留models.Manager()这个默认管理器。

自定义管理器可以用来定义共通的过滤器例如下面的例子,使用不同的
Manager来管理不同的数据更容易。

class MaleManager(models.Manager):
    def get_query_set(self):
        return super(MaleManager, self).get_query_set().filter(sex='M')

class FemaleManager(models.Manager):
    def get_query_set(self):
        return super(FemaleManager, self).get_query_set().filter(sex='F')

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))
    people = models.Manager()
    men = MaleManager()
    women = FemaleManager()

一个注意点:如果在model中定义了多个manager,则第一个manager是django的默认
管理器。django的很多部分会用默认manager来处理model。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sunyonggao/archive/2009/10/25/4726802.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值