`
xiao80xiao
  • 浏览: 80354 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics