如何自定义Django模型管理器Manager及其方法?

2026-05-24 17:071阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1009个文字,预计阅读时间需要5分钟。

如何自定义Django模型管理器Manager及其方法?

Django自定义模型管理器(Manager)和查询方法:

在Django中,每个模型至少有一个默认的Manager,通常命名为`objects`。`objects`是一个特殊的属性,代表模型的默认Manager实例。通过它,我们可以执行如`Book.objects.all()`这样的查询操作来访问数据库。

例如,在`Book`模型中,默认的Manager可以像这样定义和使用:

pythonclass Book(models.Model): title=models.CharField(max_length=100) author=models.CharField(max_length=100)

class Meta: managed=False # 如果不需要自定义管理器,可以注释或删除这一行

def __str__(self): return self.title

查询所有书籍books=Book.objects.all()

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


自定义管理器(Manager)


如何自定义Django模型管理器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()​​了,你可能接受到一个无用的返回对像,你必须避免这种情况.


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

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

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


本文共计1009个文字,预计阅读时间需要5分钟。

如何自定义Django模型管理器Manager及其方法?

Django自定义模型管理器(Manager)和查询方法:

在Django中,每个模型至少有一个默认的Manager,通常命名为`objects`。`objects`是一个特殊的属性,代表模型的默认Manager实例。通过它,我们可以执行如`Book.objects.all()`这样的查询操作来访问数据库。

例如,在`Book`模型中,默认的Manager可以像这样定义和使用:

pythonclass Book(models.Model): title=models.CharField(max_length=100) author=models.CharField(max_length=100)

class Meta: managed=False # 如果不需要自定义管理器,可以注释或删除这一行

def __str__(self): return self.title

查询所有书籍books=Book.objects.all()

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


自定义管理器(Manager)


如何自定义Django模型管理器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()​​了,你可能接受到一个无用的返回对像,你必须避免这种情况.


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

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

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