Manager是一种接口,它赋予了Django模型操作数据库的能力。Django应用中每个模型拥有至少一个Manager。
管理器名称
默认情况下,Django为每个模型类添加一个名为objects的Manager。可以通过自定义重命名Manager。
from django.db import models
class Person(models.Model):
#...
people = models.Manager()
Person.people.all()会返回包含所有Person对象的列表。
自定义管理器
继承基类Manager,在模型中实例化自定义Manager,可以在该模型中使用自定义的Manager。也可以添加额外的Manager方法,修改Manager返回的原始QuerySet。
添加额外的管理器方法
添加额外的Manager方法一般是为模型添加“表级”功能的更好方法。(行级功能通过模型方法)
自定义Manager方法能返回任何东西,没有强制必须返回一个QuerySet。
示例
- 自定义Manager提供一个with_counts(),返回包含所有OpinionPoll对象的列表。并且每个对象都有一个额外属性num_response。
from django.db import models
class PollManager(models.Manager):
def with_counts(self):
from django.db import connection
with connection.cursor() as cursor:
cursor.execute("""
SELECT p.id, p.question, p.poll_date, COUNT(*)
FROM polls_opinionpoll p, polls_response r
WHERE p.id = r.poll_id
GROUP BY p.id, p.question, p.poll_date
ORDER BY p.poll_date DESC""")
result_list = []
for row in cursor.fetchall():
p = self.model(id=row[0], question=row[1], poll_date=row[2])
p.num_responses <