【Python】【进阶篇】3、Django ORM模块精讲

news2024/11/20 2:38:38

目录

  • 3、Django ORM模块精讲
    • 1. 什么是 ORM?
    • 2. Django中定义数据表
        • 1) 模型类
        • 2) 定义数据表
    • 3. ORM 管理器对象
    • 4. ORM优势与不足

3、Django ORM模块精讲

Django 框架向我们提供了丰富的模块,避免程序员在开发的过程中重复“造轮子”,提高了开发者的工作效率。接下来的几节内容,将给大家介绍 Django 的主要功能模块,第一个模块是 Django 的 ORM 模块。

1. 什么是 ORM?

ORM (Object Realtional Mapping)即对象关系映射,它是一种基于关系型数据库的程序技术。ORM 允许你使用类和对象对数据库进行操作,这大大提高了对数据库的控制,避免了直接使用 SQL 语句对数据库进行操作。这种程序技术的底层主要是通过映射机制实现的,有兴趣的可以自己研究一下!

Web 开发中对数据库的操作是必不可少的,然而每种数据库的操作方式以及用法不尽相同。由于 Django 中 ORM 的存在,为我们操作不同种类的数据库提供了统一的方法,ORM 适配了多种常用的关系型数据库,例如 PostgreSQL、MySQL、Oracle、Sqlite3 等。

在这里插入图片描述

图1:ORM与DB映射关系图

如图1是 ORM 与数据库的映射关系图。ORM 把类映射成数据库中的表,把类的一个实例对象映射成数据库中的数据行,把类的属性映射成表中的字段,通过对象的操作对应到数据库表的操作,实现了对象到 SQL、SQL 到对象转换过程。

Django 把表模型定义为 Model,他需要继承自 django.db.models中的 Model 类,只要是与数据表相关的操作,都需要继承这个类。同时ORM 对于数据库的的增删改查,也提供了一些简单的 API,例如 F 查询、Q 查询。

针对数据库中的字段类型,Django ORM 都有对应的 “xxxField” 来表述,见如下表格。

字段类型表 字段说明字段属性
AutoFiled默然自增主键(Primary_key=Ture),Django 默认建立id字段为主键。
CharFiled字符类型Max_length=32,字符长度需要明确
IntgerFiled整型 int
DateFiled年月日时间类型auto_now=True,数据被更新就会更新时间
;auto_now_add=True,数据第一次参数时产生。
DateTimeFiled年月日小时分钟秒时间类型auto_now=True,数据被更新就会更新时间;
auto_now_add=True,数据第一次参数时产生。
DecimalFiled混合精度的小数类型
max_digits=3,限定数字的最大位数(包含小数位);decimal_places=2,限制小数的最大位数。
BooleanFiled布尔字段,对应数据库 tinyint 类型数据长度只有1位。值为True或False
TextFiled用于大文本

上表中列举了经常用到的字段类型,后续如果涉及到其它字段类型再进行介绍。

2. Django中定义数据表

那么在 Django 中如何使用 ORM 模块来定义一张数据表呢?在定义数据表之前,我们应该首先理解什么是模型类。

1) 模型类

其实模型类本质上属于一个 Python 类,只不过在 Django 中称之为做模型类 ,它是由 django.db.models.Model 派生出的子类,在 Django 中模型类是数据交互的接口,一个模型类代表数据库中的一张数据表,模型类中每一个类属性都代表数据表中的一个字段。

通过上述介绍,我们可以这样理解:Django 中模型类就相当于 ORM 模块。

2) 定义数据表

现在有一张用户信息表 UserInfo,它有两个字段 name 和 password,可以定义如下:

from django.db import models
class UserInfo(models.Model):
        name = models.CharFiled(max_length=100)
        password = models.CharFiled(max_length=100)

通过以上代码,UserInfo 数据表就已经创建完成,我们对代码进行逐行解析:

  • 第 1 行,使用 from django.db import models 导入 models 模块;
  • 第 2 行,使用 class 关键字对 UserInfo 表进行类定义,并继承了models 模块中的 Model 类;
  • 第3、4 行,数据表中的字段 name 和 password 是 UserInfo 类的属性,name 和 password 字段类型都是 CharFiled,字段长度均是100。

3. ORM 管理器对象

那么应该怎样对数据表进行操作呢?我们可以直接使用类名(即数据表名)来插入数据,下面是插入数据的一种方法:

UserInfo.objects.create(name='jay',password='abc123')

上面代码插入一条名字是“jay”,密码是“abc123”的数据。读到这里,您可能会对“ objects ”产生疑问,所以在此处讲解一个重要的概念:每个继承自 models.Model 的模型类,都会有一个 objects 对象被同时继承下来,这个对象就叫做“管理器对象”,数据库的增删改查可以用 objects 管理器对象来实现。

利用 ORM 插入数据有两种方式,上面已经介绍了一种,下面介绍第二种方法,也就是创建 UserInfo 的实例对象,然后调用save()方法保存,代码如下:

Obj=UserInfo(name="jay",password="abc123")
Obj.name="john"
Obj.save()

上述代码中 name 属性值会被赋值为“john”,最后调用 save()方法保存。

ORM 的增删改查称为 CURD 操作,下面列举几个常用语句:

UserInfo.objects.all()#查询表中的所有记录
UserInfo.objects.filter(name_contains='j')#查询表中name含有“j”的所有记录,被使用较多
UserInfo.objects.get(name="john")#有且只有一个查询结果,如果超出一个或者没有,则抛出异常
UserInfo.objects.get(name="john").delete()#删除名字为john的记录
UserInfo.objects.get(name="john").update(name='TOM')#更新数据表的name为TOM

4. ORM优势与不足

ORM 模块确实有诸多的优势,比如:

  • 使用该模块只需要面向对象编程,不需要面向数据库编写代码,对数据库的操作转换为对类属性和方法的操作,不用我们编写各种数据库的 SQL 语句。
  • 实现数据模型与数据库的解耦,屏蔽了不同数据库操作上的差异化,不在关注不同数据库内部的操作细节,通过简单更改配置就可以实现数据库的更换而无需更改代码。

与此同时 ORM 也存在一点不足之处:
相比直接用 SQL 语句操作数据库会有性能损失,因为在映射的过程中 ORM 需要与 SQL 之间进行转换,根据对象的操作转换成 SQL 语句,根据查询结果转换成对象,所以在映射的过程存在性能损失。

但是 ORM 的不足带来的这点性能损失是微不足道的,ORM 的优势还是非常突出的。因为这种对象模型和关系型数据库之间的转换方式,给开发者带来了极大的便捷,所以其它语言开发的框架,对 ORM 也有很多应用,比如 Hibernate、IBATIS、EclipseLink 等。

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

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

相关文章

Docker开发基础使用(针对开发者足够)

一.Docker概述 容器就是虚拟化吗? 是,但也不竟然。我们用一种简单方式来思考一下: 虚拟化使得许多操作系统可同时在单个系统上运行。 容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开。 这意味着什么&#xf…

Kotlin 用于数据科学的基础库(深度学习、数据挖掘)

Kotlin 用于数据科学 从构建数据流水线到生产机器学习模型, Kotlin 可能是处理数据的绝佳选择: Kotlin 简洁、易读且易于学习。静态类型与空安全有助于创建可靠的、可维护的、易于故障排除的代码。作为一种 JVM 语言,Kotlin 提供了出色的性…

机器视觉工程师买车就买“宝马”车-德国制造-世界精工

世界离开德国,整个地球的制造业将会落后五百年。 说起德国制造 在光学领域最牛的卡尔蔡司公司是制造相机镜头的世界级企业。,在机器视觉行业里面公司Mvtec,我们机器视觉工程师大多数用的halcon,就是来自于德国Mvtec,电气工程师使用的西门子PLC,西门子是是全球电子电气工程及…

兼容性测试用例

兼容性测试用例 兼容性测试是软件测试中非常重要的一块,它主要测试两个方面: 1.同一软件系统,不同版本之间的兼容性 在实际项目中,我们会遇到多种不同版本的软件系统,比如 Windows和 Linux,甚至还有 Unix、…

操作系统原理 —— 什么是进程?进程由什么组成?有什么特征?(六)

进程的概念 在我小时候,刚刚接触电脑的时候,只会在浏览器中输入 4399 搜索小游戏玩一玩,到后来,我学会了安装游戏,然后知道安装完成之后,找到对应的 .exe 的图标就可以运行游戏。 好,那么什么…

2.数据库开发

二.数据库开发 1.开发数据库流程 2.数据库,数据表,数据字段的命名 3.数据库字符集和排序规则设置 4.数据表的引擎选择 二.数据库开发 1.开发数据库流程 ①建立数据库

虚幻图文笔记:面部动画基本原理以及在UE5中如何导入面部动画

0. 面部动画的基本原理 之前做过的项目没有涉及过面部动画,所以最这方面不是很了解,一直以为面部动画也是通过骨骼来驱动的(理论上用骨骼驱动当然也是可以的),但很多时候面部动画更多是使用Morph Target(有…

SLAM论文速递【SLAM—— PLD-SLAM:一种基于点线特征的室内动态场景RGB-D SLAM新方法—4.23(1)

论文信息 题目: PLD-SLAM:A New RGB-D SLAM Method with Point and Line Features for Indoor Dynamic Scene PLD-SLAM:一种基于点线特征的室内动态场景RGB-D SLAM新方法论文地址: https://www.mdpi.com/2220-9964/10/3/163发表期刊: ISPR…

MySQL数据落盘原理(redo、undo、binlog、2PC、double write等。)

文章目录 前言一、架构图1、MySQL架构图2、InnoDB架构图 二、落盘分析1.第一阶段2.第二阶段3.第三阶段4.第四阶段5.第五阶段6.第六阶段 前言 在上一章中我们聊到了事务有四大特性:原子性、一致性、隔离性、持久性。本篇文章就持久性重点聊一下,在高性能…

离子交换法处理含铬废水

含铬废水是从哪里来的? 含铬废水来自:冶金、化工、矿物工程、电镀、制铬、颜料、制药、轻工纺织、铬盐及铬化物的生产等一系列行业,都会产生大量的含铬废水。 含铬废水危害有多大? 1、铬化合物具有致癌作用; 2、铬…

做SSM项目的步骤和优化

SSM框架整合 这里说的SSM整合,主要说的是Spring和mybatis之间的整合。因为spring和springMVC都是spring生态系统中的框架,所以spring和springMVC之间的整合是无缝的整合,即,我们在不知不觉中,其实spring和springMVC已…

【C++】list的使用

文章目录 1. list的使用1. 构造函数2.迭代器的使用和数据访问3. 容量相关4. 数据修改1.数据插入2. 数据删除 5.其他接口 1. list的使用 首先,在使用list之前,我们得先了解list到底是个什么东西,查看文档可以了解到,list的底层是一…

使用EasyExcel导出模板并设置级联下拉及其原理分析

一、概述 项目中有时会遇到需要导出一个Excel模板,然后在导出的Excel中填充数据,最终再调用接口批量把Excel中的数据导入到数据库当中的需求。 其中级联下拉选择,手机号校验,性别校验等都是比较常见的校验。 这里就已上面三种情…

县级医院手术麻醉管理系统源码 医院手麻系统源码 C/S架构 系统成熟稳定完整二次开发

医院手麻系统详细功能介绍和说明: ▶手术管理功能包括:手术申请、手术安排、查看手术申请单、手术通知单、填写病人术前会诊记录、谈话记录、麻醉记录、手术记录、附加手术、术后信息及手术回顾等功能。 ▶手术麻醉管理系统包括:手术申请、…

openEuler 欧拉 安装Oracle19c数据库RPM包安装

一、准备工作 将安装部署包上传到服务器上,我安装包放到/home目录下 二、安装依赖包 yum -y install binutils compat-libcap1 compat-libstdc-33 compat-libstdc-33*.i686 elfutils-libelf-devel gcc gcc-c glibc*.i686 glibc glibc-devel glibc-devel*.i686 ksh…

“烧钱”的大模型:初探成本拆解与推理优化方法

编者按:大模型的成本问题一直以来是大家重点关注的问题,本文重点讨论了训练大型语言模型(LLMs)需要的成本,并简要介绍什么是LLM以及一些用于优化大模型推理表现的技术。 虽然很难准确预测LLMs未来会怎么发展&#xff0…

热血

周五的晚上,决定去看「灌篮高手」电影了。 那还是很多年以前,樱木双手插进裤腰歪头扭嘴吹着口哨,那不羁的样子像极了一只从上往下看的沙雕。 而全国赛的樱木,多少是成熟了很多,是会说一些犯二的话,会和流川…

Spring Boot中上传文件不写临时文件

Spring Boot中上传文件不写临时文件 前言 在SpringBoot文件上传中,用MultipartFile类型接收文件时,SpringBoot会生成一份临时文件,文件格式为upload_*.tmp,如果业务场景有大量小文件需要上传的话,可以将文件直接丢到…

面试官:说说对称加密、非对称加密、混合加密?

对称加密 两边用同一个密钥来加解密。 A把明文通过某一算法加密之后得到密文,然后把密文发送给B,B接收到密文之后用相同的密钥执行相同的算法去解密。X没有密钥,即使窃取到密文也无法窃听。 对称加密的有优缺点 对称加密的优点&#xff1a…

TryHackMe-Misguided Ghosts(boot2root)

Misguided Ghosts 端口扫描 循例nmap FTP枚举 直接登anonymous,有几个文件,下下来 info.txt 我已经包含了您要求的所有网络信息,以及一些我最喜欢的笑话。- 帕拉摩尔该信息可能指的是pcapng文件 jokes.txt Taylor: Knock, knock. Josh: …