首先介绍一下manager的使用场景。比如我们有一些表级的功能需要复用,可以通过manager来实现。比如我们前面笔记中介绍的model的create(),update()等方法,前面的Blog.objects.create()中的objects是一种manager,但是这个是系统帮我们定义的.那么我们也可以通过manager自己定义一些通用的功能,方便我们在系统中使用。定义manager,使用manager,通过manager改变原来的QuerySet1。定义manager定义的方式是创建一个继承models.Manager的类,定义需要的功能,然后在model中定义对象指向这个Manager:classBlogManager(modls.Manager):deftest_func(self,*args,**kwargs):#执行一些操作returnclassBlog(models.Model):objects=BlogManager()2.使用manager假设我们要实现这样一个功能,通过输入关键字,返回其数据的总数名称字段包含关键字。如果不使用manager的话,我们大概每次都会这样:keyword="python"count=Blog.objects.filter(name__icontains=keyword)如果使用manager来实现,我们可以先定义这个函数:classBlogManager(models.Manager):defcontain_keyword_count(self,keyword):returnself.filter(name__icontains=keyword).count()classBlog(models.Model):name=models.CharField(max_length=100)tagline=models.TextField()objects=BlogManager()那么通过Manager的操作就是:keyword="python"count=Blog.objects.contain_keyword_count(keyword)注意这里指向的是BlogManager的变量,我们和系统默认的对象是一致的,我们可以定义成其他的Name,但是调用的时候需要改成其他的形式,例如:classBlog(models.Model):name=models.CharField(max_length=100)tagline=models.TextField()blog_objects=BlogManagerBlog.blog_objects.contain_keyword_count(keyword)3.通过manager改变原来的QuerySet。还有一些QuerySet底层函数我们也可以通过manager继承和修改,比如get_queryset()。其他如filter()、exclude()和all()位于底层。将调用此函数。现在让我们通过管理器重写这个函数:.CharField(max_length=100)tagline=models.TextField()objects=models.Manager()blog_objects=BlogManager()那么当我们调用如下:Blog.objects.all()Blog.blog_objects.all()就会有两个结果,第一个返回原来的all()结果,第二个是我们定义过滤后的结果。注意:blog_objects和原来的objects是一样的,可以在原来的基础上进行其他的过滤操作,比如:Blog.blog_objects.filter(tagline='xxx')以上只是对使用的简单介绍manager,我们可以去manager的功能中添加更复杂的功能,可以根据需要添加。以上就是这篇笔记的全部内容。在接下来的笔记中,我们将介绍迁移命令和手动添加迁移文件。
