管理器manager的使用

本文最后更新于:2 年前

管理器manager

管理器是Django内置的 Model.Manager 类,也是 Django 提供的查询数据库操作的接口,Django 应用的每个模型都至少包含一个管理器。

默认管理器对象 objects

  1. 在 views.py 中,通过默认管理器对象 objects 对模型进行增、删、改、查操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from django.http import HttpResponse
    from users.models import Student


    # 查询id为5的学生的信息
    def getstudents(request):
    student = Student.objects.get(id=5)
    return HttpResponse("姓名:" + str(student.name) + ",年龄:"+ str(student.age))

    # 修改id为5的学生的年龄
    def updateschools(request):
    result = Student.objects.filter(id=5).update(age=22)
    if result == 1:
    return HttpResponse("修改成功!")
    else:
    return HttpResponse("修改失败!")
  2. 在 urls.py 中将定义好的视图函数与路由规则进行映射

    1
    2
    3
    4
    5
    6
    7
    8
    9
    from django.urls import path
    from users.views import getschools, updatastudents, index
    from users import views

    urlpatterns = [
    path('index/', index),
    path("all/",getstudents),
    path("update/",updatestudents)
    ]
  3. 运行服务器,在浏览器中访问调用对应视图函数

自定义模型管理器

当自定义管理器后,不再自动生成默认模型管理器对象 objects ,需要自定义一个管理器类对象。(对象名可以自定义,可以不是默认管理器对象名objects)

使用场景

  • 修改管理器返回的原始数据集
  • 管理器类中添加额外的方法

修改管理器返回的原始数据集

以学生模型为例,当调用 Students.objects.all() 方法时,返回的是所有学生信息。如果希望当调用 all() 方法时返回的是所有武汉东湖学院的学生信息,则可以通过自定义管理器进行修改。

  1. 在 models.py 中,自定义一个学生模型的管理器类,修改 all() 方法返回的原始数据集

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #自定义学生模型管理器类,改变查询的结果集
    class StudentManager(models.Manager):
    def all(self):
    #调用父类的all,获取所有数据
    stus = super().all()
    #返回的stus是QuerySet集合,还可以继续使用所有查询
    students = stus.filter(schoolinfo= 1)
    #返回students
    return students
  2. 在Student模型类中自定义一个StudentManager管理器类对象

    1
    2
    3
    4
    5
    6
    7
    8
    class Student(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()
    schoolinfo = models.ForeignKey(School,on_delete=models.CASCADE)
    #自定义(重命名)StudentManager管理器类对象管
    new_objects=StudentManager()
    def __str__(self):
    return self.name

    此时在视图中如果继续使用模型类默认管理器对象objects会报错,因为自定义管理器后,不再自动生成默认模型管理器对象objects。

  3. 在 views.py 中,使用自定义管理器对象 objects 和 修改过返回数据集的 all() 方法

    1
    2
    3
    4
    5
    6
    # 查询武汉东湖学院(shcoolnfo=1)的所有学生的信息
    def getstudents(request):
    students = Student.new_objects.all()
    for stu in students:
    print(f"姓名:{stu.name} ---- 年龄:{stu.age} ---- 学校编号:{stu.schoolinfo.name}")
    return HttpResponse(students)
  4. 在 urls.py 中将定义好的视图函数与路由规则进行映射

    1
    2
    3
    4
    5
    6
    from django.urls import path
    from users import views

    urlpatterns = [
    path("all/",getstudents),
    ]
  5. 运行服务器,在浏览器中访问调用对应视图函数

    此时会发现,使用dall() 方法查询到的不再是所有学生信息,而是所有武汉东湖学院的学生信息。

管理器类中添加额外的方法

  1. 在 models.py 中,自定义一个学生模型的管理器类,添加修改姓名的 rename() 方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #自定义学生模型管理器类,添加额外的方法
    class StudentManager(models.Manager):
    # 新添加一个修改学生名字的方法
    def rename(self,old_name,new_name):
    result = super().filter(name=old_name).update(name=new_name)
    if result == 1 :
    return f"用户【{old_name}】已成功更名为【{new_name}】!"
    else :
    return f'用户【{old_name}】不存在或修改失败!'
  2. 在Student模型类中自定义一个StudentManager管理器类对象

    1
    2
    3
    4
    5
    6
    7
    8
    class Student(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()
    schoolinfo = models.ForeignKey(School,on_delete=models.CASCADE)
    #自定义(重命名)StudentManager管理器类对象管
    new_objects=StudentManager()
    def __str__(self):
    return self.name
  3. 在 views.py 中,使用自定义管理器对象 objects 和 额外添加到 rename() 方法

    1
    2
    3
    4
    # 修改学生姓名
    def rename_student(request,old_name,new_name):
    result = Student.new_objects.rename(old_name,new_name)
    return HttpResponse(result)
  4. 在 urls.py 中将定义好的视图函数与路由规则进行映射

    1
    2
    3
    4
    5
    6
    from django.urls import path
    from users import views

    urlpatterns = [
    path("rename/<str:old_name>/<str:new_name>/",rename_student),
    ]
  5. 运行服务器,在浏览器中访问调用对应视图函数