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

news/2024/7/7 19:46:52

 

类属性

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://lihuaxi.xjx100.cn/news/1103418.html

相关文章

Kali Linux 配置动态/静态 IP

[笔者系统版本] [Kali]: Kali Linux 2023.1 [Kernel]: kernel 6.1.0 [Desktop]: Xfce 4.18.1 1. Kali Linux 配置动态 IP (1). 首先查看网卡接口名称。 (2). 编辑网络接口配置文件。 (3). 网络接口配置文件的默认内容是这样的。 (4). 新增配置内容如下; 指定网卡…

【Linux】Linux学习之常用命令一

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

helm和chart

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

SwiftUI 新 Alert 弹出窗口圆你文本输入之梦

概览 小伙伴们都知道,弹出 Alert 不能包含文本输入框是 SwiftUI 的阿喀琉斯之踵(Achilles’ Heel) 。当然,这说的有些夸张了。😉 不过,Alert 不能包含 TextField 在某些情况下着实不方便。于是乎,从 SwiftUI 3.0&…

硬件-6-基站和移动通信系统的演进

1G、2G、3G、4G、5G 移动通信技术发展简史 1 移动通信系统简介 移动通信系统从第一代移动通信系统(1G)开始逐渐发展,目前已经发展到第四代移动通信系统(4G),第五代移动通信系统(5G)也已经开始标准化,预计2020年商用,6G预计2030年…

【无标题】nn.Conv2d参数详解及输入特征图尺寸的计算

在 PyTorch 中,nn.Conv2d 是一个实现了二维卷积(convolution)函数的神经网络模块。Conv2d 模块的核心部分即卷积运算,其接受的参数包括: in_channels:输入特征图(feature map)的通道…

GIT常用命令整理

文章目录 GIT常用命令整理GIT环境管理GIT分支管理代码提交:暂存区:版本对比:标签:子模块:其他: GIT常用命令整理 GIT环境管理 克隆仓库 git clone [url].gitignore:配置忽视的文件和目录,这些…

open3D

一、说明 对于点云 处理,这里介绍哦pen3d,该软件和opencv同样是interl公司的产品。 Open3D 是一个开源库,支持快速开发处理 3D 数据的软件。 Open3D 前端在 C 和 Python 中公开了一组精心挑选的数据结构和算法。后端经过高度优化,…