Django中自定义管理器Manager用法
Django中Manager用法
在管理器类中定义创建对象的方法
# 第一种
class create_user(models.Manager):
def create(self, name, sex, age):
u = self.model() # 创建模型类对象self.model可以获得模型类
u.name = name
u.sex = sex
u.age = age
u.save()
return u
# 第二种
def create_u(self, name, sex, age):
# 在创建之前的一些通用逻辑
...
u = super().create(name=name,sex=sex,age=age)
...
# 在创建之后的一些通用逻辑
return u
增加额外的方法
# 自定义manager必须继承自models.Manager
class User_manager(models.Manager):
def get_user(self,name):
return self.filter(name=name) # 自己没定义filter会去父类找filter
class User(models.Model):
name = models.CharField(max_length=100)
information = models.CharField(max_length=100)
objects = models.Manager() # 如果想要使用默认的管理器objects,则要声明出来才可以使用
diy = User_manager() # 自定义的管理器
# 原来的查询方法可以继续使用
user = User.objects.all()
# 在这里我们增加了一个自定义的查询方法get_user
user = User.diy.get_user('张三')
重写get_queryset()方法
manager的基础Queryset返回系统中的所有对象.例如,Book.objects.all()
返回book数据库中的所有书籍.你而已通过覆盖Manager.get_queryset()
方法来重写manager的基础Queryset.get_queryset()
应该按照你的需求返回一个Queryset.
例如,下面的模型有两个manger--一个返回所有对象,另一个仅返回作者是Roald Dahl的书
get_queryset()其表现形式可以看成是 .all() 使用.all()就会触发get_queryset()方法
from django.db import models
#首先,定义一个Manager的子类
class DahlBookManager(models.Manager):
def get_queryset(self):
return super(DahlBookManager, self).get_queryset().filter(author='Roald Dahl')
或者 return super().get_queryset().filter(author='Roald Dahl')
# 然后,将它显式地插入到Book模型中
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
...
objects = models.Manager() # 默认Manager
dahl_objects = DahlBookManager() # 自定义的特殊Manager
# 使用
Book.dahl_objects.all() 默认就是查条件为author='Roald Dahl'筛选之后的数据了
在这个示例模型中,Book.objects.all()
将返回数据库中的所有书籍,而Book.dahl_objects.all()
只返回作者是Roald Dahl的书籍.注意我们明确的将objects
设置为默认Manger的一个实例,因为如果我们不这样做,那么dahl_objects将成为唯一一个可用的manager.
由于get_queryset()
返回一个Queryset对象,所以你可以使用filter()
,exclude()
和其他所有的Queryset方法.
如果你使用自定义的Manager对象,请注意,Django遇到的第一个Manager(以它在模型中被定义的位置为准)会有一个特殊状态。 Django将会把第一个Manager 定义为默认Manager ,Django的许多部分(但是不包括admin应用)将会明确地为模型使用这个manager。 结论是,你应该小心地选择你的默认manager。因为覆盖get_queryset()
了,你可能接受到一个无用的返回对像,你必须避免这种情况.