自定义模型管理器类的使用

  • 首先我们要明白经常使用的objects到底是什么?
  1. 每一个模型类默认有一个objects属性,它是由django注定生成,我们把objects称为模型管理器。
  • 自定义管理器类的应用场景:
  1. 改变查询的结果集,封装增删改查等方法
  2. 需要重写模型管理器中现有的方法

注意:自定义模型管理器类之后,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

这就解决了以后无论模型类名字怎么变,封装方法这一块都不用修改。

猜你喜欢

转载自blog.csdn.net/wenpy/article/details/90899292
今日推荐