zoukankan      html  css  js  c++  java
  • python测试开发django-111.模型管理器(models.Manager)

    前言

    django在使用ORM查询数据库的时候,经常用到django的模型类调用objects属性,再调用.all() .filter()查询。
    这里的objects到底是什么呢?objects属性实际上是models.Manager()的实例对象。

    objects属性

    models.py 设计一个 Teacher 模型类

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    
    class Teacher(models.Model):
        """老师表"""
        name = models.CharField(max_length=30)
        age = models.IntegerField(blank=True, null=True)
        tel = models.CharField(max_length=30)
        is_delete = models.CharField(max_length=10, default=0, blank=True)
    
        def __str__(self):
            return self.name
    

    使用objects属性查询

    D:MyDjango>python manage.py shell
    Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    (InteractiveConsole)
    >>> from yoyo.models import Teacher
    >>> Teacher.objects.all()
    <QuerySet [<Teacher: 悠悠老师>, <Teacher: 张三老师>, <Teacher: 李四老师>, <Teacher: 王五老师>]>
    >>>
    

    模型管理器(models.Manager)

    如果我们在Teacher 类里面定义一个模型管理器(models.Manager)

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    
    class Teacher(models.Model):
        """老师表"""
        name = models.CharField(max_length=30)
        age = models.IntegerField(blank=True, null=True)
        tel = models.CharField(max_length=30)
        is_delete = models.CharField(max_length=10, default=0, blank=True)
    
        def __str__(self):
            return self.name
    
        # 自定义一个obj属性
        obj = models.Manager()  # 自定义模型管理对象
    

    Teacher 类有了 obj 属性,就可以 Teacher.obj 调用了

    D:MyDjango>python manage.py shell
    Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    (InteractiveConsole)
    >>> from yoyo.models import Teacher
    >>> Teacher.obj.all()
    <QuerySet [<Teacher: 悠悠老师>, <Teacher: 张三老师>, <Teacher: 李四老师>, <Teacher: 王五老师>]>
    >>> Teacher.objects.all()
    Traceback (most recent call last):
      File "<console>", line 1, in <module>
    AttributeError: type object 'Teacher' has no attribute 'objects'
    >>>
    

    当设置了obj属性后,就不能用原来的objects属性调用了

    重写查询all()

    自定义管理器类主要用于两种情况:
    1.修改原始查询集,重写all()方法
    2.向管理器类中添加额外的方法,如向数据库中插入数据。

    先看查询all()的时候,删选出is_delete字段为0的数据,默认不查询is_delete为1的

    >>> Teacher.obj.filter(is_delete='0').values()
    <QuerySet [{'id': 1, 'name': '悠悠老师', 'age': 18, 'tel': '12313231', 'is_delete': '0'}, {'id': 3, 'name': '李四老师', 'age': 22, 'tel': '1121212', 'is_delete': '0'}]>
    

    于是可以重写all()方法

    class TeacherModelManager(models.Manager):
    
        def all(self):
            # 调用父类的成员语法为:super().方法名
            # 设置只返回未删除的数据
            return super().all().filter(is_delete='0')
    

    Teacher类定义objects属性

    class Teacher(models.Model):
        """老师表"""
        name = models.CharField(max_length=30)
        age = models.IntegerField(blank=True, null=True)
        tel = models.CharField(max_length=30)
        is_delete = models.CharField(max_length=10, default=0, blank=True)
    
        def __str__(self):
            return self.name
    
        # 自定义一个obj属性
        objects = TeacherModelManager()  # 自定义模型管理对象
    

    于是调用all方法查询的时候就会带着条件去查询了

    D:MyDjango>python manage.py shell
    Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    (InteractiveConsole)
    >>> from yoyo.models import Teacher
    >>> Teacher.objects.all().values()
    <QuerySet [{'id': 1, 'name': '悠悠老师', 'age': 18, 'tel': '12313231', 'is_delete': '0'}, {'id': 3, 'name': '李四老师', 'age': 22, 'tel': '1121212', 'is_delete': '0'}]>
    >>>
    

    自定义查询方法

    在查询的时候可以自己定义一些查询方法,方便自己调用得到查询结果
    1.自定义一个查询张三老师的方法
    2.自定义根据查询结果倒叙

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    
    class TeacherModelManager(models.Manager):
    
        def all(self):
            # 调用父类的成员语法为:super().方法名
            # 设置只返回未删除的数据
            return super().all().filter(is_delete='0')
    
        def get_zhangsan(self):
            """自定义一个查询张三老师的方法"""
            return self.filter(name="张三老师")
    
        def get_all_desc(self, order_by="age"):
            """查询结果倒叙"""
            return self.filter(is_delete='0').order_by('-'+order_by)
    

    查询张三老师和查询结果默认根据age字段倒叙

    D:202107djangoMyDjango>python manage.py shell
    Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    (InteractiveConsole)
    >>> from yoyo.models import Teacher
    >>> Teacher.objects.get_zhangsan()
    <QuerySet [<Teacher: 张三老师>]>
    >>> Teacher.objects.get_all_desc().values()
    <QuerySet [{'id': 3, 'name': '李四老师', 'age': 22, 'tel': '1121212', 'is_delete': '0'}, {'id': 1, 'name': '悠悠老师', 'age': 18, 'tel': '12313231', 'is_delete': '0'}]>
    >>>
    

    参考文档:https://docs.djangoproject.com/zh-hans/2.1/topics/db/managers/

  • 相关阅读:
    C#利用反射动态调用类及方法
    系统程序监控软件
    SQL server 2008 安装和远程访问的问题
    sql server 创建临时表
    IIS 时间问题
    windows 2008 安装 sql server 2008
    sql server xml nodes 的使用
    Window 7sp1 安装vs2010 sp1 打开xaml文件崩溃
    CSS资源网址
    Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/15182825.html
Copyright © 2011-2022 走看看