zoukankan      html  css  js  c++  java
  • django自定义模型管理器Manager及方法

    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()了,你可能接受到一个无用的返回对像,你必须避免这种情况.

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

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

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

  • 相关阅读:
    Oracle11g 安装 -Linux
    oracle 11g安装-window
    将本地文件上传到github
    highcharts实现画辅助线功能并删除
    eclipse中一个项目引用另一个项目的方法
    Kubernetes label简单使用
    spark 报错 InvalidClassException: no valid constructor
    NFS服务配置 Linux
    Ubuntu-Server18.04开启无线网卡并配置静态ip
    Ubuntu18.04安装mysql并配置远程访问
  • 原文地址:https://www.cnblogs.com/weiweivip666/p/14786289.html
Copyright © 2011-2022 走看看