模型成员
类属性
显性: 自己写的那些
隐性: objects 是一个Manager类型的一个对象(实例),作用于数据库进行交互
当模型类没有指定管理器的时候,Django会自动为我们创建模型管理器
当然我们也可以自定义管理器,
class Student(models.Model):
stuManager = models.Manager()
当自定义模型管理器时,objects就不存在了,Django就不会为我们自动生成模型管理器
模型管理器是Django的模型与数据库进行交互的接口,一个模型可以有多个模型管理器
自定义模型管理器作用:
可以向管理器中添加额外的方法
修改管理器返回的原始查询集
提供创建对象的方式
class StudentManager(models.Manager):
def get_queryset(self):
return
super(StudentManager,self).get_queryset.filter(isDelete=False)
def createStudent(self):
stu = self.model()
# 设置属性
return stu
实践:
建立模型:
class Animal(models.Model):
a_name = models.CharField(max_length=16)
接着url:
url('getanimals',views.get_animals),
views:
def get_animals(request):
animals = Animal.objects.all()
for animal in animals:
print(animal.a_name)
return HttpResponse('动物获取成功')
这时我们在models中加入a_m = models.Manager()
再次访问
会发现报错,报错原因为Animal没有objects这个属性
因为objects是隐形属性,在我们没有声明时,系统会自动生成这个属性,我们用a_m声明了Manger系统就不会自动生成这个属性。
我们在models中添加is_delete字段,进行逻辑删除,查询时只能查找出is_delete字段为false的字段,所以凡是在查询的地方,我们都要追加一条这样的方法:filter(is_delete=False)
但是这样很麻烦
由面向对象的三大特性:封装,继承,多态
我们可以将这种重复性工作进行封装,而这时就用到了Manager
操作如下,我们手动建立models.Manager模型,而且在Animal中调用这个Manger模型
# 创建新的Manager模型以便可以自定义封装查询要求
class AnimalManager(models.Manager):
# 封装查询要求
def get_queryset(self):
return super(AnimalManager, self).get_queryset().filter(is_delete=False)
class Animal(models.Model):
a_name = models.CharField(max_length=16)
is_delete = models.BooleanField(default=False)
# 将方法定义成objects这样就能实现伪装
objects = AnimalManager()
并且将cat的is_delete改为1
views函数中:
def get_animals(request):
animals = Animal.objects.all()
for animal in animals:
print(animal.a_name)
return HttpResponse('动物获取成功')
这样我们就能查询出优化后的结果
自定义Manageer还可以创建新的对象。
此处评论已关闭