Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “a”是什么;经理;在django?_Python_Django - Fatal编程技术网

Python “a”是什么;经理;在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使用它来连接
模型
代码和数据库后端

当您查询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