模型成员

类属性

  显性: 自己写的那些
  隐性: 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()再次访问
image.png
会发现报错,报错原因为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还可以创建新的对象。

最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏