Django框架之模型自定义管理器

news2024/12/24 13:57:01

 

类属性

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',

]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/496273.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

疫情红利出清后如何破局?华大智造的三场突围战

作者|严睿 华大智造(688114.SH)上市后的首份年报,亮点颇多。 比如2022年公司营收再创新高,达到42.31亿元,净利润同比增长3倍余;比如2022年度华大智造基因测序仪全球装机量达到600,…

处理日期和时间的 chrono 库

C11 中提供了日期和时间相关的库 chrono,通过 chrono 库可以很方便地处理日期和时间,为程序的开发提供了便利。chrono 库主要包含三种类型的类:时间间隔duration、时钟clocks、时间点time point。 1. Ratio 时间精度(节拍) std::chrono::ra…

helm和chart

Helm helm是Kubernetes 应用的包管理工具,主要用来管理 Charts,类似Linux系统的yum。Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata,以便于应用程序的分发。 he…

Linux驱动编程(总线设备驱动模型)

一、驱动编写的3种方法 1、传统写法 使用哪个引脚,怎么操作引脚,都写死在代码中。最简单,不考虑扩展性,可以快速实现功能。修改引脚时,需要重新编译。 2、总线设备驱动模型 引入 platform_device/platform_driver&am…

【.NET基础加强第八课--委托】

.NET基础加强第八课--委托 委托(Delegate)委托操作顺序实例多播委托—委托链实例实例委托传值 委托(Delegate) 委托(Delegate) 是存有对某个方法的引用的一种引用类型变量 委托操作顺序 1,定义一个委托类…

SpringCloud------Eureka修改实例显示信息、服务发现Discovery、自我保护(六)

SpringCloud------Eureka修改实例显示信息、服务发现Discovery、自我保护(六) 1.actuator微服务信息完善 2.服务发现Discovery 3.Eureka自我保护 actuator微服务信息完善 web和actuator依赖用于图形化监控 1.主机名称:服务名称修改 新增…

新库上线 | CnOpenData缺陷产品召回数据

缺陷产品召回数据 一、数据简介 缺陷产品召回,是指缺陷产品的生产商、销售商、进口商在得知其生产、销售或进口的产品存在可能引发消费者健康、安全问题的缺陷时,依法向职能部门报告,及时通知消费者,设法从市场上、消费者手中收回…

快速跑通环信IM Android Demo

1、以Android 4.0.0 Demo为例 https://www.easemob.com/download/demo (下载别的版本的demo 可以修改版本号直接下载就就可以) https://downloadsdk.easemob.com/downloads/easemob-sdk-4.0.0.zip 运行时遇到以下报错在项目build.gradle中添加运行时遇…

SAXS测试在材料结构表征中的应用与优势

SAXS测试在材料结构表征中的应用与优势 SAXS是指小角X射线散射,是一种用于研究物质结构的重要技术。SAXS技术可以用于表征各种材料的结构,如聚合物、胶体、纳米粒子等。本文将介绍SAXS测试在材料测试表征中的应用,包括SAXS曲线、比表面积、粒…

MySQL基础(四)运算符

1. 算术运算符 算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加()、减(-)、乘(*)、除(/)和取模(%&am…

选对信息化管理系统,企业运营效率大幅提升!

随着信息化的发展,企业信息化管理系统已经成为企业独立商业活动和发展的重要基础设施之一。然而,在众多的信息化管理系统中,选择一款适合企业的信息化管理系统并不是一件易事,本文将从选型的角度,为企业提供一些选对合…

第二章 图像基本运算及变换

文章目录 前言一、图像运算1. 加减乘除2. 位运算 二、翻转与旋转1.翻转2.旋转 三、仿射变换1. 介绍2. 变换的数学表达2.1 平移2.2 缩放2.3 旋转 3. 变换矩阵4. 变换叠加5. 变换矩阵的逆推6.OpenCV实现以及手动实现6.1 手动实现6.2OpenCV实现 7.向量空间----补充 四、透视变换1.…

人脉变现小程序裂变定制开发

人脉变现小程序裂变定制开发可以提供以下服务: 需求分析:了解客户的业务需求和目标,并为其量身定制开发方案,提供专业的建议和意见。 UI/UX设计:根据客户的品牌形象和用户体验要求,设计出符合客户需…

简单实现基于UDP与TCP的回显服务器

目录 前言UDP 版的回显服务器需要用到的 api服务端客户端UDP 版本的字典客户端和字典服务器 TCP 版的回显服务器需要用到的 api服务器客户端对服务器进行改进(使用线程池)TCP 版本的字典客户端和字典服务器 前言 我们写网络程序, 主要编写的是应用层代码. 真正要发送这个数据,…

浅谈联网汽车安全漏洞

​“智能网联汽车存在内生共性问题,即软硬件的漏洞后门,基于此进行的网络攻击可以直接带来勒索、盗窃、大规模车辆恶意操控风险,还有数据泄露等网络安全事件。如果内生的漏洞后门问题不解决,系统自身难保,很难谈系统安…

浙大数据结构第四周之二叉搜索树与平衡二叉搜索树(AVL)

题目详情:04-树4 是否同一棵二叉搜索树 给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是…

【Python系列】一个简单的抽奖小程序

序言 很开心你能在万千博文中打开这一篇,希望能给你带来一定的帮助!👍🏻 如果有什么问题,都可以添加下方我的联系方式,联系我噢~😁 ⭐️⭐️⭐️⭐️⭐️沟通交流,一起成为技术达人&…

SpringMVC底层原理源码解析

SpringMVC的作用毋庸置疑&#xff0c;虽然我们现在都是用SpringBoot&#xff0c;但是SpringBoot中仍然是在使用SpringMVC来处理请求。 我们在使用SpringMVC时&#xff0c;传统的方式是通过定义web.xml&#xff0c;比如&#xff1a; <web-app><servlet><servle…

jenkins配置笔记

文章目录 1.装Gogs插件2.配置截图及说明3.其他1.装Gogs插件 Gogs 插件是一个专门为集成 Gogs(一种类似于 Git 的开源版本控制系统)与 Jenkins 进行交互的插件。它允许 Jenkins 与 Gogs 之间进行双向通信,提高了 Jenkins 对于代码管理和构建的支持。 2.配置截图及说明 目前…

【操作系统】第二章进程与线程、处理机调度与调度算法

文章目录 &#x1f337; 一、进程的定义、组成、组织方式及特征⭐️ 1、 进程的定义⭐️ 2、 进程实体的组成⭐️ 3、 进程的组织⭐️ 4、 进程的特征 &#x1f337; 二、进程的状态与转换⭐️ 1、 状态⭐️ 2、 进程状态间的转换 &#x1f337; 三、进程控制⭐️ 1、 定义⭐️…