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:\202107django\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.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/

posted @ 2021-08-24 22:16  上海-悠悠  阅读(328)  评论(0编辑  收藏  举报