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

1.5 KiB
Raw Blame History

title date tags
Django Manager Method 2016-04-25 00:00:01
django

Django Manager

Django 里会为每一个 model 生成一个 Manager默认名字为 objects一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理QuerySet 方法是对数据库操作的封装。

eg.

from django.db import models

class Person(models.Model):
	...
	people = models.Manager()

上面这个 modelPerson.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.

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