Django ORM模块精讲

03【高级秘籍】Django ORM查询全解析:15个必会技巧提升性能10倍 extra()# 添加自定义选择字段# 添加自定义WHERE条件# 添加自定义ORDER BYorder_by=['-price * sold_count'] # 按总销售额排序了解生成的SQL:总是了解你的ORM查询生成的SQL减少查询次数:使用select_related和prefetch_related减少查询优先使用数据库操作:使用数据库函数而非Python处理大量数据恰当使用索引:为常用查询条件创建索引,但避免过多索引批量操作。 阅读详情

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与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,可以定义如下:

  1. from django.db import models
  2. class UserInfo(models.Model):
  3. name = models.CharFiled(max_length=100)
  4. 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 管理器对象

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

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

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

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

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

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

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

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

4. ORM优势与不足

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

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


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

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

一篇文章带你了解Django ORM操作 Django ORM是一种对象关系映射(ORM)系统,它将数据库表转换成Python类,从而使得开发者可以使用Python对象的方式来操作数据库。通过Django ORM,开发者可以避免编写SQL语句,而是使用Python语法来执行数据库操作。Django ORM是Django框架的核心组件之一,它简化了数据库操作,使开发者能够使用Python语法来执行数据库查询。通过本文对Django ORM的基本概念、使用方法和常见操作的介绍,读者可以更好地理解和使用Django ORM,提高开发效率。 阅读详情

相关推荐

Python从0到100(四十三):数据库与Django ORM 精讲

Django 里面, 数据库表的操作,包括 表的定义、表中数据的增删改查,都可以通过 Model 类型的对象进行的。通常,在Django中:定义一张数据库的表 就是定义一个继承自 django.db.models.Model 的类定义该表中的字段(列), 就是定义该类里面的一些属性类的方法就是对该表中数据的处理方法,包括 数据的增删改查在Django中,定义数据模型非常简单。我们只需要在models.py文件中创建继承自Model的类,并定义相应的字段即可。

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 8万+

ORM--对象关系映射

一、什么是ORM? 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。 ORM在业务逻辑层和数据库层之间充当了桥梁的作用。 二、ORM的由来 让我们从O/R开始。...

Auhiak的博客 6551

Python Django框架基础教程(非常细)_v20210226

Django是什么? Django MTV和MVC的区别 Django ORM模块精讲 Django auth应用模块 Django Admin后台管理系统 Django视图函数 URL是什么 Django路由系统精讲 Django中间件 Django Cache缓存系统 搭建Django开发环境 Django安装与配置教程(图解) Django创建第一个项目 如何启动Django项目详解 settings.py配置文件详解 如何配置settings.py文件 Django初

dream it possible 1864

Django学习(2):Django的ORM操作

在 Django 中,使用模型类来定义数据模型,这些模型类是 Python 类,它们继承自。

qq_62278240的博客 3743

2023年Django期末复习实战指南:大二下学期核心知识点精讲

Django的模型(Model)是应用程序数据结构的中心定义,它不仅描述了数据字段和行为,还负责与数据库进行交互。每一个继承自的类都会被Django自动映射为一张数据库表。这种“代码即模式”的设计理念使得开发者无需直接编写SQL语句即可完成数据库建模。有时需要更精细的控制,比如仅允许管理员访问:")")对于类视图,可以结合这种方式实现了跨视图类型的统一权限策略,便于集中管理和审计。

weixin_36328210的博客 299

QGIS基于快鸟(QuickBird)影像统计小麦种植面积

​01数据情况 本次选用某地4月份快鸟(QuickBird)影像为例,使用QGIS演示提取小麦播种情况,并按照200米*200米分区计算种植面积的过程。 注:本文对应的操作视频作为今天第二篇推送同时发布,习惯看视频的朋友可以点击观看。 附数据压缩包: 链接:https://pan.baidu.com/s/1JVUS8uAOR61RxC1n9Or9_w 提取码:qgis 含快鸟影像QB_subset.tif和200*200米分区矢量图层200Mgrid.shp。 ...

QGISClass的博客 1979

Django之ORM简单使用

这里写目录标题ORM简介模块类设计根据模型类生成表通过模型类操作数据表 ORM简介 ORM:对象关系映射,模型映射(Django这一重量级框架的一个特点。) django中内嵌了ORM框架,ORM框架可以将【类和数据表进行对应起来】,只需要通过类和对象就可以对数据表进行操作。 设计类:模型类。 ORM另外一个作用:根据设计的类生成数据库中的表。 总结性的说:django中带orm工具,orm工具是干什么呢?就是对数据库操作的一个封装。 比如查询数据:select * from 表名 where id =3;

pinxingxian的博客 3103

kali破解wifi之airmon-ng 工具利用

......

qq_42378173的博客 1万+

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

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

deepboat的博客 1003

zds1104示波器使用指南

(2)将探头连接到探头补偿端,按下auto setup按键,一键捕获。(3)连接需要测量信号,开始查看波形。操作说明书,可以自行查看操作说明书。

m0_61973119的博客 6763

别再死磕RD算法了!用MATLAB手把手复现SAR后向投影(BP)成像(附完整代码与避坑点)

本文详细介绍了如何使用MATLAB实现合成孔径雷达(SAR)后向投影(BP)成像算法,突破传统RD算法在大斜视和复杂轨迹场景中的局限。通过完整的代码示例和避坑指南,帮助读者掌握BP算法的核心原理、内存优化策略和并行计算技巧,提升SAR成像精度与效率。

weixin_30908103的博客 296

django mysql orm教程_Django ORM模块精讲

Django 框架向我们提供了丰富的模块,避免程序员在开发的过程中重复“造轮子”,提高了开发者的工作效率。接下来的几节内容,将给大家介绍 Django 的主要功能模块,第一个模块是 Django 的 ORM 模块。1. 什么是 ORM?ORM (Object Realtional Mapping)即对象关系映射,它是一种基于关系型数据库的程序技术。ORM 允许你使用类和对象对数据库进行操作,这大大...

weixin_30700095的博客 290

华为OD新系统真题-最小极差分组(C/C++/Py/Java/Js/Go)

华为OD机试 新系统真题【最小极差分组】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【最小极差分组】多语言题解。

qq_45776114的博客 584

Django的web框架Django Rest_Framework精讲(二)

这一章,我们主要讲解DRF中的字段校验validators,以及DRF中常用的一些参数和模型类序列化器等。

景天科技苑 2206

98DX3236内核编译过程小结

0.条件(1)Marvell技术支持提供的压缩文件:GNU EABI:arm-mv5sft-linux-gnueabi_SW3.2.tar.bz2.tar.bz2armebv7-marvell-linux-gnueabi-softfp_i686_201201.tar.bz2CPSS代码:Cpss-PP-DxCh-4.2_012.zipLinux内核文件:lsp-4.2_012.zipLSP-Uni...

snaking616 1801

【ArcGIS Pro微课1000例】0047:深度学习--棕榈树提取全流程

对汤加科洛瓦伊种植园每棵棕榈树的健康状况进行清查和评估,这需要花费大量的时间和劳动力。为简化此过程,将在 ArcGIS Pro 中使用深度学习模型来识别树木,然后根据植被绿度的测量值计算其健康状况。第一步是找到显示汤加科洛瓦伊的影像,该影像具有足够精细的空间和光谱分辨率来识别树木。获得此影像后,将创建训练样本并将其转换为可供深度学习模型使用的格式。为了让模型识别出它的查找任务,需要定义棕榈树的影像,以便识别相似的像素和树木大小。

智慧空间实验室 2205

python 进阶项目_Django ORM进阶应用

本教程的《Django ORM模块精讲》一节中,我们对 Django 的 ORM 模块进行了详细的介绍,那么 ORM 框架如何配合项目使用呢?本章将围绕 index 应用,首先创建应用所需要的 Models 数据表,之后介绍 ORM API 的相关使用方法,最后讲解如何通过 admin 后台管理系统实现对数据表的增删改查。由于每一个数据表对应一个 Model 定义,每一个 Model 都是一个 P...

weixin_29787613的博客 348

threejs中使用Reflector实现出倒影效果,并实现背景透明的效果(Reflector镜面背景透明, 倒影弱化)

在项目中遇到要实现倒影效果,threejs给我们提供了Reflector,可以轻松完成镜面效果,实现倒影。但背景不透明;并且反射出的倒影太亮了;网上没搜到解决方案, 自己修改了下源码实现了想要的效果,做个记录...

weixin_40856652的博客 5720

【Python】【进阶篇】20、Django ORM进阶应用

【Python】【进阶篇】20、Django ORM进阶应用

deepboat的博客 1153

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

就业系统(二):使用ORM操纵MySQL数据库及Django导入导出

一、在django框架中配置mysql 1.下载pymysql pip install pymysql==0.9.3 2.在settings.py文件中配置 (1)先添加上这几行代码 import pymysql # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))

xiaomingming99的博客 930

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Django的web框架Django Rest_Framework精讲(一)

Django REST framework是一个建立在Django基础之上的Web 应用开发框架,可以快速的开发REST API接口应用,简称DRF。 在REST framework中,提供了序列化器Serialzier的定义,可以帮助我们简化序列化与反序列化的过程,把queryset类型数据自动转化为json等可以传到前端的数据类型 不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。

景天科技苑 8848

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

DJANGO:0基础精讲

【代码】DJANGO:0基础精讲。

weixin_48348409的博客 170

职坐标Python入门实战精讲

《职坐标Python入门实战精讲》专为零基础学员打造,通过语法精讲、案例实战及项目开发,系统讲解Python核心语法、数据分析及Web开发技能,涵盖文件操作、爬虫入门及Django框架应用,助你快速掌握Python编程精髓,轻松应对数据分析和自动化办公场景。

haitongzzb的博客 1336

精讲模型系统02

1.模型配置 Django建造网站的基本途径: 建立视图,路由,模板和模型. 视图负责处理一些主观逻辑,然后返回响应结果,视图的主观逻辑经常牵涉到与数据库的交互,这里引入了一个ORM概念,即模型系统,模型系统(object elational Mapping)是一种为了解决面向对象语言python与关系数据库存在的互不匹配的技术 简单的说就是:python代码在对数据库数据进行修改的时候,需要这个...

weixin_43495473的博客 240

第48课:Python|Django框架基础【项目创建、模型映射与后台管理系统】

Django入门:快速构建数据驱动网站 摘要 Django是一个“大而全”的Web框架,内置ORM、模板引擎、管理后台等组件,适合快速开发功能完备的Web应用。本文介绍了Django的核心概念和开发流程: 项目结构:通过startproject创建项目,startapp创建功能模块 MTV架构:Model定义数据模型,Template负责展示,View处理业务逻辑 ORM操作:使用Python类定义数据表结构,通过迁移命令自动同步到数据库 Admin后台:只需简单注册模型即可获得完整的数.......

Java 后端|Python|AI 实战博主。专注微服务、分布式、大模型应用开发,输出可落地项目、源码剖析与面试总结。用通俗文字拆解技术难点,记录开发路上的学习与踩坑,期待和大家一起交流成长。 502
下一篇: 【2026最新】WinSCP下载安装全流程教程(附官网安装包+图文步骤)
sshjsgd
博客等级 码龄1年 3粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值