管理器
-
说明
模型类.objects.查询函数 中的objects是什么呢,这个就是管理器。objects是django自动生成的管理器对象,通过这个管理器对象可以实现对数据的查询
type(Book.objects) <class 'django.db.models.manager.Manager'>
查看objects的类型,可以看到objects是models.Manager的一个对象
-
作用
管理器的作用
-
改变查询集的结果
-
添加额外的方法(原来里面没有进行封装的方法,可以自己添加着进行使用)
-
-
改变查询集的结果:
改变查询集的结果说白了就是让重写原来的查询函数,让它又特定的功能。只不过是将它封装在管理器类中。
代码演示:
class BookInforManage(models.Manager): #重写父类的方法 def all(self): books = super().all() return books.filter(book_id__gt='4')
继承父类的all方法后,然后进行改写,将满足条件的封装进来.
然后可以看到,再次调用all方法的时候,就不会将所有的对象展现出来了,只会将满足条件的筛选出来,这里是书籍编号大于4的筛选出来。
运行结果:
可以看到再次调用all方法的时候,出现的并不是所有的对象,而是大于4的对象的集合。 -
添加额外的方法:
代码演示:
class BookInforManage(models.Manager): #从写父类的方法 def all(self): books = super().all() return books.filter(book_id__gt='4') def create_objects(self,bname,badd): models_book = self.model() # 实时获取使用这个管理器类的模型类对象。这样就不管实例化这个类的对象怎么改,都可直接获取到。 b = models_book() b.book_name = bname b.book_add = badd b.save() return b
写了一个添加的新方法create_objects()。在这个方法中添加书籍并保存。
运行结果:
添加成功后查看数据库中数据是否已经进去
可以看到数据添加成功。 -
创建模型管理器类对象
创建模型管理器后,原来自动生成的objects对象就不再被使用了
class Book(models.Model): book_id = models.AutoField(primary_key=True) book_name = models.CharField(max_length=20) book_add = models.CharField(max_length=10) #自定义管理器对象 supervisor = models.Manager()
创建模型管理器对象可以在模型类中实例化models.Manager对象就行
在shell终端中查看情况:
可以看到Book中已经没有这个objects对象了,原因就是因为已经自己定义了另外一个models.Manager类对象。
查看对象中的所有信息,只需要调用新的objects对象就可以了
从新定义管理器对象后,需要从新进入shell中进行查询,才会出现上面的结果。
但是一般的情况下不会这样进行。因为这样会导致代码量加大。也不方便后面进行维护
所以我们会直接定义一个管理器类,在这个类里面添加自己的额外的方法。 -
管理器类
一般我们会另外创建一个管理器类然后在里面改变查询结果和添加额外的方法,这里先暂时不写,只是说明原理。class BookInforManage(models.Manager): pass # 创建书籍类 class Book(models.Model): book_id = models.AutoField(primary_key=True) book_name = models.CharField(max_length=20) book_add = models.CharField(max_length=10) #自定义管理器对象 supervisor = BookInforManage()
创建管理器类对象后,在Book模型类中实例化了BookInforManage这个类。然后直接调用就行。
shell终端中
在shell终端中可以看到,Book.supervisor已经变成了我们创建的BookInforManage的类型。