类属性
objects 是manager类的一个对象,作用是与数据库进行交互。
当定义模型类没有指定管理器,django会为模型创建objects管理器。
表结构与数据
CREATE TABLE `myapp_grades` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`boy_num` int(11) NOT NULL,
`girl_num` int(11) NOT NULL,
`create_time` datetime(6) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
CREATE TABLE `myapp_students` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`gender` tinyint(1) NOT NULL,
`age` int(11) NOT NULL,
`desc` varchar(20) NOT NULL,
`isDel` tinyint(1) NOT NULL,
`grades_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `myapp_students_grades_id_id_6986a1ea` (`grades_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
INSERT INTO `school`.`myapp_grades` (`id`, `name`, `boy_num`, `girl_num`, `create_time`) VALUES (1, 'python01', 8, 5, '2023-04-23 00:00:00.000000');
INSERT INTO `school`.`myapp_grades` (`id`, `name`, `boy_num`, `girl_num`, `create_time`) VALUES (2, 'python2', 7, 6, '2023-04-23 00:00:00.000000');
INSERT INTO `school`.`myapp_students` (`id`, `name`, `gender`, `age`, `desc`, `isDel`, `grades_id`) VALUES (1, '薛仁贵', 0, 18, '千军万马避白袍', 0, 1);
INSERT INTO `school`.`myapp_students` (`id`, `name`, `gender`, `age`, `desc`, `isDel`, `grades_id`) VALUES (2, '岳飞', 0, 30, '三十功名尘与土,八千里路云和月', 0, 1);
INSERT INTO `school`.`myapp_students` (`id`, `name`, `gender`, `age`, `desc`, `isDel`, `grades_id`) VALUES (3, '花木兰', 1, 21, '替父从军', 0, 1);
自定义管理器类
模型管理Manager类是django的模型与数据库交互的接口,一个模型可有多个模型管理器。
自定义管理器后,Django就不在为模型类生产objects模型管理器,原有objects方法也无法使用。
作用
向管理器类中添加额外的方法
修改管理器返回的原始查询集(原有方法直接返回的是原始对象)。
实现通过重写get_queryset()方法
代码示例
myapp.models.py
实现自定义管理器类
class Students(models.Model):
""" 学生表模型 """
# 自定义模型管理器
stuObj = models.Manager()
自定义模型管理器后,在使用objects方法,提示错误
之后数据调用使用stuObj。
如查询所有学生类数据应改为
studentsList = Students.stuObj.all()
get_queryset()方法,过滤掉isDel=False的
class StudentsManager(models.Manager):
def get_queryset(self):
# 过滤掉isDel = False数据
return super(StudentsManager, self).get_queryset().filter(isDel=False)
class Students(models.Model):
""" 学生表模型 """
# 自定义模型管理器
stuObj = models.Manager()
stuObj2 = StudentsManager()
视图方法改为stuobj2
studentsList = Students.stuObj2.all()
创建对象
目的
向数据库中添加数据。因为__init__方法已经在父类models.Model中使用,在自定义的模型中无法使用。所有创建对象也需要自定义方法来创建对象。
注意
当创建对象时,django不会对数据库进行读写操作,当调用save()方式时才与数据库进行交互;将对象保存到数据库中。
方法
1.在模型类中增加方法
在Students类中定义一个类方法创建对象;cls就是students类
@classmethod
def createStudent(cls, name, gender, age, desc, hobby, grades, isDel=False):
stu = cls(name=name, gender=gender, age=age, desc=desc,
hobby=hobby, grades=grades, isDel=isDel)
return stu
views.py
from django.http import HttpResponse
from .models import Grades, Students
def store_student(request):
""" 创建学生 """
grades = Grades.objects.get(pk=2)
stu = Students.createStudent('张三', 0, 35, '喜欢法律', '篮球', grades)
stu.save()
return HttpResponse('添加成功')
urls.py
path('storeStudents', views.store_student, name='storeStudent')
2.在定义管理器中定义方法
models.py
class StudentsManager(models.Manager):
def get_queryset(self):
# 过滤掉isDel = False数据
return super(StudentsManager, self).get_queryset().filter(isDel=False)
def add_student(self, name, gender, age, desc, hobby, grades, isDel=False):
stu = self.model()
stu.name = name
stu.gender = gender
stu.age = age
stu.desc = desc
stu.hobby = hobby
stu.grades = grades
stu.isDel = isDel
return stu
urls.py
path('addstudents2', views.store_student2, name='storestudent2')
视图
views.py
def store_student2(request):
""" 新增学生 """
grades = Grades.objects.get(pk=2)
stu = Students.stuObj2.add_student('张三2', 0, 35, '喜欢法律2', '篮球', grades)
stu.save()
return HttpResponse('添加成功')
关闭CSRF验证
修改projects/settings.py中MIDDLEWARE
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]