模型类.objects.all可以查询出所有的数据
objects是什么
?
它是一个模型类的管理器
本质是一个描述符,描述符是一个类属性的值是另一个类的实例化对象
如何自定义模型类管理器的all方法
?
自定义一个类
类继承models.Manager
在类中重写all方法
在方法中调用父类方法
拿到父类方法的调用结果后再对数据进行处理
!
# 定义一个英雄类管理器
class HeroManage(models.Manager):
def all(self):
all_data = super().all()
filter_data = all_data.filter(kt_id__exact=1)
return filter_data
# 英雄模型类
class Hero(models.Model):
name = models.CharField(max_length=20)
skill = models.CharField(max_length=40)
kt = models.ForeignKey("katoon", on_delete=models.CASCADE, default=1)
# man = models.Manager()
objects = HeroManage()
什么是模型类管理器
》查询英雄表的全部内容,代码的写法
models.Hero.objects.all()
在这里面的objects,就是管理器
它不仅有all方法,还有其它更多的方法
比如
filter
等等
如果我们会操作这个东西,就可以给它新增方法或者把功能给强化
原则上不改它的源代码
但是可以写一个自定义的类
让自定义的类去继承模型管理器的类
下面,先演示功能现象
然后再介绍常见的操作
模型类的管理器的功能演示》给一个普通的模型类添加描述符
l图例中,类属性man现在是一个管理类了。
它将会产生特别的效果。
比如,代替原来的objects。
详情看步骤:
》生成迁移文件
》迁移文件
》进入shell
》描述符生效
》然而以前的objects没有用了
原因是,man霸了objects的功能
模型类的管理器的用法可以利用模型类管理器,自己定义特别的方法,个性化的方法
》开始演练过程
写一个自定义的类
让这个类继承models.Manage类
如果在这个自定义类里写方法
这个方法可以被模型类使用
》先查一下数据库
当前我们的英雄表中有如下数据
》管理器的查询全部方法,可得到全部数据
all方法,试一试
练习的前提条件,把类还原为原来的状态
由状态1,还原为状态2,注意数据的迁移不要漏了
》正常的查询情况
模型管理器的all方法
》想法,改装all方法,让它只输出kt_id为1的内容
》办法,通过模型管理类来实现
自定义了一个英雄类管理器,它继承了models.Manager
在这个自定义的管理器类中,我们重写了all方法
先通过父类的all方法调用获取正常的数据
然后再把这些数据进行过滤,并且返回过滤后的结果
》结果,all方法的查询内容改变了
得到的是我们自定义的结果
有了上面的技巧
我们就可以直接给管理器添加新的方法了
面向对向的知识,这里就需要用上
自定义一个方法,例子调用这个方法,就往数据库中插入一条数据
# 定义一个英雄类管理器
class HeroManage(models.Manager):
def all(self):
all_data = super().all()
filter_data = all_data.filter(kt_id__exact=1)
return filter_data
def create_one_random(self):
# 获取管理器所在的模型类
hero_model = self.model
# 新增一个行对象
new_line = hero_model()
# 生成数据
import random
name = "_".join(random.sample(["a","b","c","1","2","3"],3))
skill = "会心一击"
kt_id = 1
# 保存数据
new_line.name = name
new_line.skill = skill
new_line.kt_id = kt_id
new_line.save()
# 英雄模型类
class Hero(models.Model):
name = models.CharField(max_length=20)
skill = models.CharField(max_length=40)
kt = models.ForeignKey("katoon", on_delete=models.CASCADE, default=1)
# man = models.Manager()
objects = HeroManage()
def __str__(self):
return self.name
运行结果
当然,还可以自定义别的方法,只要你想,你就可以