hugo-blog/content/posts/Django-Manager-Method.md
Ching 5ba7024532 feat(content; layouts; static): migrate hexo blog. add new theme fuji.
migrate hexo blog. add new theme fuji.

Signed-off-by: Ching <loooching@gmail.com>
2022-02-07 23:38:40 +08:00

56 lines
1.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Django Manager Method
date: 2016-04-25 00:00:01
tags:
- django
---
#### 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 已经变成 peopleobjects 这个 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)