作用: 可以扩展Manager管理器的原生功能
缺点: 麻烦, 如果在Manager中自定义方法,还不如在类中写类方法实在
模型成员:
模型类中有一个Manager类的对象,通过管理器对象可以实现和数据库的访问。
没有为模型类定义管理器时,Django会为模型类生成一个名为objects的管理器,
自定义管理器后,Django不再生成默认管理器objects。
管理器是Django的模型进行数据库操作的接口,Django应用的每个模型都拥有至少一个管理器。
Django支持自定义管理器类,继承自models.Manager。
自定义管理器类主要用于两种情况:
(1). 修改原始查询集
(2). 向管理器类中添加额外的方法,如向数据库中插入数据。
一. 重命名管理器
(1). 在模型类中定义一个新的管理器
# 替换objects
# 在模型类中自定义一个新的管理器,则原有的objects管理器就不会存在
class User(models.Model):
...
# 可以自定义,但意义不大
user_manager = Manager() # 自定义调用系统管理器
(2). 视图函数中使用新的管理器操作数据库
# 使用自定义管理器查询
data=User.user_manager.all()
(3). 代码示例
二. 自定义管理器
(1). models.py 扩展Manager管理器功能
# 扩展Manager管理器功能
class MyManager(Manager):
# 重写父类get_queryset方法
def get_queryset(self):
# 父类获取结果集方法.过滤()
return super().get_queryset().filter(sex__isnull=False) # 把User中的sex不为空的显示,调用的类中必须有sex字段
# 自定义方法
def after(self, data):
# 返回已经通过扩展功能过滤一遍的结果集 .filter(时间 > data)
return User.objects.filter(regtime__gt=data)
(2). 模型类中 自定义管理器
class User(models.Model):
...
objects = MyManager() # 系统管理器,此时调用的也是自定义的管理器
sex_manager = MyManager() # 使用自定义管理器
(3). 视图函数调用 管理器
# 使用自定义管理器查询
data = User.sex_manager.all()
print(data) # 查询sex不为空的结果集
# 调用管理器的自定义方法
# sex_manager: 已经过滤一次的结果集 .after方法
data1 = User.sex_manager.after("2023-09-07 11:49:53.000000")
print(data1)
(4). 代码示例
三. 类方法扩展查询
(1). 模型类中定义类方法
class User(models.Model):
...
@classmethod
def after(cls, data):
# 大于 data 的时间
return cls.objects.filter(regtime__gt=data)
@classmethod
def get_sexes(cls):
# 不为空的数据
return cls.objects.filter(sex__isnull=False)
(2). 视图函数调用
# 调自己的类方法
data = User.after("2023-09-07 11:49:53.000000")
print(data)
data1 = User.get_sexes()
print(data1)