https://docs.djangoproject.com/en/2.1/topics/db/managers/
默认情况下,Django 为所有的model 都添加一个名家objects 的 Manager,用于与数据库交互
1. 关于Manager 的名字
默认情况下,Django为model 添加的manager的名字为objects。你可以自己更改。例如:
from django.db import models
class Person(models.Model):
#...
people = models.Manager()
当进行如上修改后,则访问Person.objects就会触发AttributeError异常。正常的访问方式变成:Person.people.all()这种形式。
2.自定义Manager
当你想为你的manager 添加特别的方法而是修改Manager的默认行为时,你就需要去自定义Manager.
2.1 添加自定的方法
自定义的manager 方法可以返回任何东西,而不一定需要返回一个QuerySet。
例如,下面的例子中,在自定义的Manager 的with_counts中返回了一个OptionPoll对象列表。并在OptionPoll模型中使用了自定义Manager。
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=ro