当前位置 : 主页 > 编程语言 > python >

django自定义模型管理器Manager及方法

来源:互联网 收集:自由互联 发布时间:2022-06-20
django自定义模型管理器Manager及方法 自定义管理器(Manager) 在语句Book.objects.all()中,objects是一个特殊的属性,通过它来查询数据库,它就是模型的一个Manager.每个django模型至少有一个man

django自定义模型管理器Manager及方法


自定义管理器(Manager)


在语句Book.objects.all()中,objects是一个特殊的属性,通过它来查询数据库,它就是模型的一个Manager.每个django模型至少有一个manager,你可以创建自定义manager以定制数据库的访问。

这里有两个方法创建自定义manager:添加额外的manager,修改manager返回的初始Queryset.


添加额外的manager


增加额外的manager是为模块添加表级功能的首选办法(至于行级功能,也就是只作用于模型实例对象的函数,则通过自定义模型方法实现)。例如,为Book模型添加一个title_count()的manager方法,它接受一个keyword,并返回标题中包含keyword的书的数量。

​​models.py​​

from django.db import models

# 自定义模型管理器类
class BookManager(modles.Manager):
# 自定义模型管理器中的方法
def title_count(self, keyword):
return self.filter(title__icountains=keyword).count()

class Book(model.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
...
objects = BookManager()

def __str__(self):
return self.title

1.我们创建一个BookManager类,继承自django.db.models.Manager,它只有一个方法title_count(),来进行统计。注意,这个方法使用了self.filter(),这个self指manager本身!

2.将BookManager()赋值给模型的objects属性,它将取代模型的默认manager(objects)。把它命名为objects是为了与默认的manager保持一致。

Books.objects.title_count('django') # 这是我们自定义的manager中的查询方法
Books.objects.filter(title__icontains='django').count() # 原来默认的查询方法依然可用

这样我们可以将经常使用的查询进行封装,就不必写重复代码了。


修改初始Manager Queryset


manager的基础Queryset返回系统中的所有对象,例如Book.objects.all()返回book数据库中的所有书籍。

你可以通过覆盖Manager.get_queryset()方法来重写manager的基础Queryset.get_queryset()应该按照你的需求返回一个Queryset.

例如下面的模型有两个manager,一个返回所有对象,另一个仅返回作者是Roald Dahl的书

from django.db import models

# 首先,定义一个Manager的子类
class Dah1BookManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(author='Roald Dahl')

# 然后,将它显示的插入到Book模型中
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
...
objects = models.Manager() # 默认Manager
dahl_objects = DahlBookManager() # 自定义的特殊manager

在这个示例模型中,​​Book.objects.all()​​​将返回数据库中的所有书籍,而​​Book.dahl_objects.all()​​​只返回作者是Roald Dahl的书籍.注意我们明确的将​​objects​​设置为默认Manger的一个实例,因为如果我们不这样做,那么dahl_objects将成为唯一一个可用的manager.
由于​​​get_queryset()​​​返回一个Queryset对象,所以你可以使用​​filter()​​​,​​exclude()​​和其他所有的Queryset方法.

如果你使用自定义的Manager对象,请注意,Django遇到的第一个Manager(以它在模型中被定义的位置为准)会有一个特殊状态。 Django将会把第一个Manager 定义为默认Manager ,Django的许多部分(但是不包括admin应用)将会明确地为模型使用这个manager。 结论是,你应该小心地选择你的默认manager。因为覆盖​​get_queryset()​​了,你可能接受到一个无用的返回对像,你必须避免这种情况.


-------------------------------------------

个性签名:代码过万,键盘敲烂!!!

如果觉得这篇文章对你有小小的帮助的话,记得“推荐”哦,博主在此感谢!


上一篇:django中update_or_create()
下一篇:没有了
网友评论