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/

  • 相关阅读:
    MaskRCNN路标:TensorFlow版本用于抠图
    TensorFlow: Could not load requested Qt binding.
    OpenCV3 Java 机器学习使用方法汇总
    pycuda installation error: command 'gcc' failed with exit status 1
    OpenCV:使用OpenCV3随机森林进行统计特征多类分析
    CNN结构:Windows使用FasterRCNN-C++版本
    CNN结构:色彩特征提取-从RGB空间到HSV空间(色彩冷暖判断)
    CNN结构:色温-冷暖色的定义和领域区分(一)
    CNN结构:色彩空间建模-色彩空间分析
    windows编译MaskRCNN
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/15182825.html
Copyright © 2011-2022 走看看