Python “a”是什么;经理;在django?
我已经阅读了官方Django中的定义,我仍然对Python “a”是什么;经理;在django?,python,django,Python,Django,我已经阅读了官方Django中的定义,我仍然对经理的工作感到困惑 文档中说它们允许您对数据库表/模型进行操作,但我仍然不理解这一点 有人能向我解释一下经理和他们的角色吗?最好用一个例子来回答。管理者通常是隐藏在django程序员之外的东西,django使用它来连接模型代码和数据库后端 当您查询django ORM时,可以通过调用 from my_app.models import MyModel mms = MyModel.objects.all() 在这种情况下,函数的对象部分由管理器返回
经理的工作感到困惑
文档中说它们允许您对数据库表/模型进行操作,但我仍然不理解这一点
有人能向我解释一下经理和他们的角色吗?最好用一个例子来回答。管理者通常是隐藏在django程序员之外的东西,django使用它来连接模型
代码和数据库后端
当您查询django ORM时,可以通过调用
from my_app.models import MyModel
mms = MyModel.objects.all()
在这种情况下,函数的对象
部分由管理器返回。如果您希望MyModel只获得蓝色
MyModel
实例(数据库可能也包含红色
模型),那么您可以创建一个管理器并对您的模型进行黑客攻击
class BlueManager(models.Manager):
def get_query_set(self):
return super(BlueManager, self).get_query_set().filter(colour='Blue')
class MyModel(models.Model):
colour = models.CharField(max_length=64)
blue_objects = BlueManager()
和呼唤
MyModel.blue_objects.all()
将仅将带有颜色的对象返回为蓝色
。注意,这是一种非常糟糕的过滤模型的方法
如果要修改管理器通常会返回的QuerySet
s,或者如果需要添加“表”级查询(而不是常规的django“行”级),通常需要修改Manager
接口。《管理器指南》非常完整,包含几个示例。管理器是应用程序和数据库之间的某种“门户”。一件好事是,您可以为模型定义自己的基本查询集。例如:如果您有带有“可用性”字段的模型“Book”,您可以准备自己的queryset,它过滤特定类型的可用性类型:
models.py:
class AvailableBookManager(models.Manager):
def get_query_set(self):
return super(AvailableBookManager, self).get_query_set().filter(availability=1)
class Book(models.Model):
(...)#fields definition
objects = models.Manager() #default manager
available_objects = AvailableBookManager() #own manager
现在您可以使用:
books = Book.available_objects.all()
除此之外:
books = Book.objects.filter(available=1)
定义
从文档中:
管理器是一个Django类,它提供数据库查询操作和Django模型之间的接口
换句话说,在Django模型中,管理器是与数据库交互的接口。例如,当您希望从数据库检索对象时,需要通过模型类上的管理器构建查询集
默认情况下,管理器可通过Model.objects
属性使用。此管理器是django.db.models.manager
。但是,扩展它并更改默认管理器非常简单
客户经理
发件人:
通过扩展基本管理器类并在模型中实例化自定义管理器,可以在特定模型中使用自定义管理器
您可能希望自定义管理器的原因有两个(没有一个是独占的):
添加额外的管理器方法
要修改经理返回的初始查询集
示例:向管理器添加额外方法
来自django.db导入模型的
类DocumentManager(models.Manager):
def PDF(自):
返回self.filter(文件\u type='pdf')
def小于(自身大小):
返回self.filter(大小\uu lt=size)
类文档(models.Model):
name=models.CharField(最大长度=30)
size=models.PositiveIntegerField(默认值=0)
文件类型=models.CharField(最大长度=10,空白=真)
对象=DocumentManager()
定义(自我)->str:
返回self.name
示例:修改经理返回的初始查询集
来自django.db导入模型的
类AuthorManager(models.Manager):
def get_queryset(自我):
return super().get\u queryset().filter(first\u name\u startswith='M')
类作者(models.Model):
first_name=models.CharField(最大长度=100)
last_name=models.CharField(最大长度=100)
email=models.EmailField()
对象=AuthorManager()
定义(自我)->str:
返回f“{self.first_name}{self.last_name}”
示例:同时有多个经理
对于同一模型,可以有多个管理器
来自django.db导入模型的
从django.db.models.functions导入长度
类图书标题管理器(models.Manager):
def简短标题(自我):
返回self.annotate(长度=length('title')).filter(长度=20)
def长标题(自我):
返回self.annotation(长度=length('title')).filter(长度=20,长度=30)
def非常长的标题(自我):
返回self.annotation(长度=长度('title')).filter(长度\uu gt=30)
def以(self,字母)开头:
返回self.filter(title\u startswith=字母)
类BookPagesManager(models.Manager):
def小型图书(自助):
返回self.filter(页数\uu lt=200)
def中型图书(自助):
返回self.filter(pages_ugte=200,pages_ult=300)
def大型书籍(自):
返回自过滤器(pages_uGTE=300,pages_uLTE=500)
教材(models.Model):
title=models.CharField(最大长度=255)
作者=models.CharField(最大长度=255)
pages=models.IntegerField()
objects=models.Manager()
标题=图书标题管理器()
大小=BookPagesManager()
定义(自我)->str:
由{self.author}返回f'{self.title}'
在上一个代码示例中,有3个管理器:分别分配给对象
、标题
和大小
的默认模型.Manager
、书籍标题管理器
前几任经理的问题在于,您无法按如下方式将其链接:
>>Book.titles.long_titles()。以('P'开头)
AttributeError:'QuerySet'对象没有属性'starts_with'
示例:自定义管理器和查询集(允许使用链)
如果要链接在管理器中定义的方法,则应定义自定义查询集,如下所示:
来自django.db导入模型的
从django.db.models.functions导入长度
类AuthorQuerySet(models.QuerySet):
def long_名字(自我):
返回self.annotation(长度=长度(“名字”)).filter(长度=10)
def short_姓氏(自我):
返回self.annota