54 lines
1.5 KiB
Markdown
54 lines
1.5 KiB
Markdown
---
|
||
title: Django Manager Method
|
||
date: 2016-04-25 00:00:01
|
||
---
|
||
|
||
|
||
|
||
#### Django Manager
|
||
|
||
Django 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。
|
||
|
||
eg.
|
||
|
||
```python
|
||
from django.db import models
|
||
|
||
class Person(models.Model):
|
||
...
|
||
people = models.Manager()
|
||
```
|
||
|
||
上面这个 model,`Person.objects`会产生一个`AttributeError`,但是`Person.people`就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。
|
||
|
||
#### 自定义 Manager
|
||
|
||
通常需要自定义 manager 的情况有两点:
|
||
|
||
1. 需要修改/扩展 Django 的 manager 方法
|
||
2. 需要修改返回的 QuerySet
|
||
|
||
#### 默认 Manager
|
||
|
||
如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。
|
||
|
||
笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。
|
||
|
||
eg.
|
||
|
||
```python
|
||
class Book(models.Model):
|
||
title = models.CharField(max_length=100)
|
||
author = models.CharField(max_length=50)
|
||
|
||
objects = models.Manager() # default manager
|
||
custom_objects = CustomBOokManager() # custom manager
|
||
```
|
||
|
||
|
||
|
||
[source](http://blog.csdn.net/sicofield/article/details/49283751)
|
||
|
||
|
||
|