模型成员
此处讨论的是模型中重要的实例方法和属性
模型实例方法
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.修改原始查询集,重写get_queryset()方法
自定义管理器类: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)