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

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

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

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

  • 相关阅读:
    Samba 4.0 RC3 发布
    SymmetricDS 3.1.7 发布,数据同步和复制
    Express.js 3.0 发布,Node.js 的高性能封装
    GIFLIB 5.0.1 发布,C语言的GIF处理库
    jQuery UI 1.9.1 发布
    SVN Access Manager 0.5.5.14 发布 SVN 管理工具
    DynamicReports 3.0.3 发布 Java 报表工具
    HttpComponents HttpClient 4.2.2 GA 发布
    AppCan 2.0 正式发布,推移动应用云服务
    Ruby 2.0 的新功能已经冻结
  • 原文地址:https://www.cnblogs.com/weiweivip666/p/14786289.html
Copyright © 2011-2022 走看看