14-Manager管理器

发布时间 2023-03-28 18:40:39作者: 测试圈的彭于晏
# 可以扩展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)