Django进阶之模型自定义管理器

文章介绍了Django中模型管理器的作用,如何自定义管理器以添加额外功能,如过滤数据。通过`get_queryset`方法修改默认查询集,并展示了在模型中创建自定义方法来创建和保存对象到数据库的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类属性

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('添加成功')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值