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

本文介绍了Django中模型管理器的作用,如改变查询结果集和封装数据库操作。通过自定义模型管理器类,可以避免因模型类名更改而需要频繁修改代码的问题。文中提供代码示例展示如何创建和使用自定义管理器,并利用model属性实现方法的通用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 首先我们要明白经常使用的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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值