# 可以扩展Manager管理器的原生功能
# 如果在Manager中自定义方法,还不如在类中写类方法实在
模型成员
模型类中有一个Manager类的对象,通过管理器对象可以实现和数据库的访问。
没有为模型类定义管理器时,Django会为模型类生成一个名为objects的管理器,
自定义管理器后,Django不再生成默认管理器objects。
管理器是Django的模型进行数据库操作的接口,Django应用的每个模型都拥有至少一个管理器。
Django支持自定义管理器类,继承自models.Manager。
自定义管理器类主要用于两种情况:
修改原始查询集
向管理器类中添加额外的方法,如向数据库中插入数据。
'''
1. 重命名管理器
# 替换objects
# 在模型类中自定义一个新的管理器,则原有的objects管理器不会存在,以后对数据库的操作使用自己定义的管理器
# models.py
class User(models.Model):
sex = models.IntegerField(null=True)
class Meta: # 元数据,模型本身的信息
db_table = "user" # 指定表名
def __str__(self):
return sex
# 可以自定义,单意义不大
user_manager = Manager() # 自定义调用系统管理器
# views.py
def manage(request):
# 使用自定义管理器查询
data=User.user_manager.all()
print(data)
return HttpResponse("自定义管理器")
2. 自定义管理器
# models.py
# 1. 扩展Manager管理器功能
class MyManager(Manager):
# 获取查询结果集然后进入函数过滤
def get_queryset(self): # 重写父类get_queryset
# 把User中的sex不为空的显示
return super().get_queryset().filter(sex__isnull=False) # 调用的类中必须有sex字段
def after(self, data): 自定义
return User.objects.filter(regtime__gt=data)
# 2. 模型类调用扩展管理器
class User(models.Model):
..........
class Meta: # 元数据,模型本身的信息
db_table = "user" # 指定表名
def __str__(self):
return ...
objects = MyManager() # 系统管理器
sex_manager = MyManager() # 使用自定义管理器
# 3. views.py调用
def manage(request):
# 调用管理器的方法
data=User.sex_manager.all()
for user in data:
print(user.sex) # 查询结果sex不为空
# 调用管理器的自定义方法
data=User.sex_manager.after("2023-02-11")
print(data)
# 4. 可编写类方法
class User(models.Model):
...
...
...
objects = MyManager() # 系统管理器
sex_manager = MyManager() # 使用自定义管理器
@classmethod
def after(cls, data):
return cls.user_manager.filter(regtime__gt=data)
@classmethod
def get_sexes(cls):
return cls.objects.filter(sex__isnull=False)
# 5. views.py调用
def manage(request):
# 调自己的类方法
data = User.after("2023-02-11")
print(data)