- 首先我们要明白经常使用的objects到底是什么?
- 每一个模型类默认有一个objects属性,它是由django注定生成,我们把objects称为模型管理器。
- 自定义管理器类的应用场景:
- 改变查询的结果集,封装增删改查等方法
- 需要重写模型管理器中现有的方法
注意:自定义模型管理器类之后,django不会自动再帮我们生成objects管理器。
代码演示:
class BookInfoManager(models.Manager):
'''自定义了一个模型管理器类'''
def all(self):
'''重写all方法,只返回没有删除的图书'''
# # 1.调用父类的all,获取所有数据
# books = super(BookInfoManager, self).all() # 返回的是queryset
# # 2.对数据进行过滤
# books = books.filter(is_delete=False)
# # 3.返回books
# return books
# 简写
return super().all().filter(is_delete=False)
def create_books(self, title, pub_date, comment):
'''封装额外的方法,方便调用'''
new_book = BookInfo()
new_book.title = title
new_book.pub_date = pub_date
new_book.comment = comment
new_book.save()
return new_book
class BookInfo(models.Model):
title = models.CharField(max_length=20)
pub_date = models.DateField()
read = models.IntegerField(default=0)
comment = models.CharField(max_length=200)
is_delete = models.BooleanField(default=False)
# 自定义管理器类的对象
objects = BookInfoManager()
注意:自定义模型管理器类的代码要放在模型类的上面,否则会报错。
- python manage.py shell进入shell终端:
>>> from booktest1.models import BookInfo
>>> BookInfo.objects.create_books('test', '2019-6-5', '这个方法真棒')
<BookInfo: BookInfo object>
>>> BookInfo.objects.create_books('封装额外的方法', '2019-6-5', '这个方法真棒')
<BookInfo: BookInfo object>
- 上述已经完成了自定义模型管理器类的两个应用,但在实际情况中,模型类的名字变化,封装函数时难道又要重新修改模型类的名字,这时该怎么办呢?
其实每一个模型管理器对象都有一个model,其作用就是获取self所在的模型类。
>>> BookInfo.objects.model
<class 'booktest1.models.BookInfo'>
- 所以这个时候就可以优化封装函数这一部分的代码
def create_book(self, title, pub_date, comment):
'''封装额外的方法,方便调用'''
# new_book = BookInfo()
# 获取self所在的模型类
new_book = self.model()
new_book.title = title
new_book.pub_date = pub_date
new_book.comment = comment
new_book.save()
return new_book
这就解决了以后无论模型类名字怎么变,封装方法这一块都不用修改。