模型成员

此处讨论的是模型中重要的实例方法和属性

模型实例方法

  • str : 在将对象转换成字符串时会被调用
  • save : 将模型对象保存到数据库表中
  • delete : 将模型对象从数据库表中删除

objects模型属性

  • objects : 管理器对象
    • Manager类型的对象,定义在from django.db import models
    • 用于模型对象和数据库交互
    • 是默认自动生成的属性,但是可以自定义管理器对象
  • 自定义管理器对象后,Django不再生成默认管理器对象objects

自定义管理器对象

  • 为模型类BookInfo自定义管理器对象books :

      # 书籍信息模型
      class BookInfo(models.Model):
          name = models.CharField(max_length=20) #图书名称
          pub_date = models.DateField(null=True) #发布日期
          readcount = models.IntegerField(default=0) #阅读量
          commentcount = models.IntegerField(default=0) #评论量
          isDelete = models.BooleanField(default=False) #逻辑删除
    
          #元类信息 : 修改表名
          class Meta:
              db_table = 'bookinfo'
    
          # 自定义管理器对象
          books = models.Manager()
    
  • 自定义管理器对象后,查询数据时直接使用 books 查询

      # 书籍列表信息视图
      def bookList(request):
          # 查询数据库书籍信息 : 自定义管理器对象前
          # bookInfos = BookInfo.objects.all()
    
          # 查询数据库书籍信息 : 自定义管理器对象后
          bookInfos = BookInfo.books.all()
    
          # 构造上下文
          context = {'booklist':bookInfos}
    
          return render(request, 'Book/booklist.html', context)
    

管理器类Manager

  • 定义在from django.db import models
  • 管理器是Django的模型进行数据库操作的接口,Django应用的每个模型都拥有至少一个管理器
  • Django模型支持自定义管理器类,继承自models.Manager

  • 自定义管理器类主要用于两种情况

    • 1.修改原始查询集,重写get_queryset()方法
      • 查询时,如果需要默认过滤掉某些数据,需要修改原始查询集
    • 2.新增管理器方法,如创建模型对象方法...
      • 当模型属性很多,多数字段为默认值,每次只需要给少数属性赋值时,可以新增模型初始化方法
    • 注意 :不能重写init方法做初始化操作?
    • 原因 :Model本身会在init方法中做默认的初始化操作,如果重写该方法会跟Model默认的冲突

自定义管理器类:1.修改原始查询集

  • 1.1 准备工作:把bookinfo表中的isDelete字段修改成True

  • 1.2 问题:逻辑删除字段为True的那条记录依然会被查询出来

  • 1.3 解决: 自定义管理器类,重写get_queryset()方法

      from django.db import models
    
      # 自定义管理器类
      class BookInfoManager(models.Manager):
          # 自定义管理器类场景一:重写get_queryset()方法
          def get_queryset(self):
              # 调用父类的成员语法为:super(子类型, self).成员
              # 默认只查询逻辑删除字段为False的记录
              return super(BookInfoManager, self).get_queryset().filter(isDelete=False)
    
      # 自定义管理器对象
      # books = models.Manager()
    
      # 自定义管理器类实例化出来的管理器对象
      books = BookInfoManager()
    
      # 书籍列表信息视图
      def bookList(request):
          # 查询数据库书籍信息 : 自定义管理器对象后
          bookInfos = BookInfo.books.all()
    
          # 构造上下文
          context = {'booklist':bookInfos}
    
          return render(request, 'Book/booklist.html', context)
    

自定义管理器类:2.新增管理器方法

  • 2.1 新增管理器初始化模型对象方法:只有name属性需要赋值,其他的字段都是默认值

      # 自定义管理器类
      class BookInfoManager(models.Manager):
          # 自定义管理器类场景一:重写get_queryset()方法
          def get_queryset(self):
              # 调用父类的成员语法为:super(子类型, self).成员
              # 默认只查询逻辑删除字段为False的记录
              return super(BookInfoManager, self).get_queryset().filter(isDelete=False)
    
          # 初始化模型对象方法
          def create(self, name):
              book = BookInfo()
              book.name = name
              book.pub_date = '1989-11-11'
              book.readcount = 0
              book.commentcount = 0
              book.isDelete = False
              return book
    
  • 2.2 使用新增的初始化方法

      # 书籍列表信息视图
      def bookList(request):
    
          # 初始化模型对象:自定义管理器类后
          bookInfos = [
              BookInfo.books.create('张小厨'),
              BookInfo.books.create('张小杰'),
          ]
    
          # 构造上下文
          context = {'booklist':bookInfos}
    
          return render(request, 'Book/booklist.html', context)