文章目录
  1. 1. 什么是Manager管理器
    1. 1.1. 向管理器类中添加额外的方法
    2. 1.2. 修改管理器返回的原始查询集
    3. 1.3. 补充
  2. 2. 总结

什么是Manager管理器

首先Manager是models 模块里面的一个类
管理器是Django 的模型进行数据库查询操作的接口
Django 应用的每个模型都拥有至少一个管理器,默认为objects

在Django Book提到的Manager有以下两个用处:

向管理器类中添加额外的方法

以最近的看的案子中代码为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
class TestManager(models.Manager):
class Meta:
abstract = True

def is_existing(self, username):
try:
return self.get(username= username)
except:
return None

class UserInfo(models.Model):
email = models.EmailField(blank=False, null=False, unique=True)
objects = TestManager()

我在manager中添加了一个方法供单元测试使用,在测试代码中:

1
2
3
def test_existing(self):
for item in self.test_objects:
self.assertEqual(item, self.menu_class.objects.is_existing(**item))

修改管理器返回的原始查询集

这里在Django Book上就有很好的例子:

1
2
3
4
5
6
7
8
9
10
11
12
# First, define the Manager subclass.
class DahlBookManager(models.Manager):
def get_queryset(self):
return super(DahlBookManager, self).get_queryset().filter(author='Roald Dahl')

# 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.

该例子在一个模型中使用两个管理器:
一个是默认的objects = models.Manager()返回所有的信息.
一个重写get_queryset方法,让得到的queryset只包含作者为Roald Dahl的信息.

补充

另外,在Django Book的另外一个例子中,你会发现在创建的Manager中会出现self.model,那这是什么呢?
其实self.model就相当于Manager所在的模型类,那self.model()也无非就是创建对象.

总结

Manager在案子中用到的还是蛮多的,值得你懂得!!

文章目录
  1. 1. 什么是Manager管理器
    1. 1.1. 向管理器类中添加额外的方法
    2. 1.2. 修改管理器返回的原始查询集
    3. 1.3. 补充
  2. 2. 总结