管理器manager的使用
本文最后更新于:2 年前
管理器manager
管理器是Django内置的 Model.Manager 类,也是 Django 提供的查询数据库操作的接口,Django 应用的每个模型都至少包含一个管理器。
默认管理器对象 objects
在 views.py 中,通过默认管理器对象 objects 对模型进行增、删、改、查操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16from 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("修改失败!")在 urls.py 中将定义好的视图函数与路由规则进行映射
1
2
3
4
5
6
7
8
9from 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)
]运行服务器,在浏览器中访问调用对应视图函数
自定义模型管理器
当自定义管理器后,不再自动生成默认模型管理器对象 objects ,需要自定义一个管理器类对象。(对象名可以自定义,可以不是默认管理器对象名objects)
使用场景
- 修改管理器返回的原始数据集
- 管理器类中添加额外的方法
修改管理器返回的原始数据集
以学生模型为例,当调用 Students.objects.all() 方法时,返回的是所有学生信息。如果希望当调用 all() 方法时返回的是所有武汉东湖学院的学生信息,则可以通过自定义管理器进行修改。
在 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在Student模型类中自定义一个StudentManager管理器类对象
1
2
3
4
5
6
7
8class 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。
在 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)在 urls.py 中将定义好的视图函数与路由规则进行映射
1
2
3
4
5
6from django.urls import path
from users import views
urlpatterns = [
path("all/",getstudents),
]运行服务器,在浏览器中访问调用对应视图函数
此时会发现,使用dall() 方法查询到的不再是所有学生信息,而是所有武汉东湖学院的学生信息。
管理器类中添加额外的方法
在 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}】不存在或修改失败!'在Student模型类中自定义一个StudentManager管理器类对象
1
2
3
4
5
6
7
8class 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在 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)在 urls.py 中将定义好的视图函数与路由规则进行映射
1
2
3
4
5
6from django.urls import path
from users import views
urlpatterns = [
path("rename/<str:old_name>/<str:new_name>/",rename_student),
]运行服务器,在浏览器中访问调用对应视图函数
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!