Django之ORM操作初了解

文章开篇,我们首先复习下Django架构中的MTV模式,分别以字母来翻译就是:

  • Views-代码的核心逻辑
  • Tamplates-展示在页面上的html代码
  • Models-对数据库的操作

那么Models中最为核心的便是本篇所介绍的ORM。

一)基本知识

ORM,关系对象映射,这是对它的本质进行翻译。那么我看来,ORM(Object Relational Mapping)是一种思想,它将对象和关系型数据库之间建立了映射关系。尽管使用ORM框架需要一些额外的开销,但经过恰当调优的ORM和手写原生的数据访问代码在性能上仍然有可比性。有些开发者可能因为以往的性能不佳的经验而拒绝采用ORM技术。不过,使用现代的ORM框架和合适的优化技巧,可以减少性能问题,并提高开发效率。
image.png
总结来看,ORM的开发效率高,执行效率低。

1.基本操作
a.操作步骤简介

那么在Django框架中我们想使用,四步:

  1. 在我们根目录中的setting.py中可以看见如下代码以连接数据库:image.png
  2. 在根目录中的setting.py中注册app:

image.png

  1. 编写models.类
INSTALLED_APP = [..."app01.apps.App01Config"
]
  1. 执行命令

这一步分为两小步也就是两个命令

python manage.py makemigrations   
# 找到所有已注册的app中的models.py中的类读取 -> migrations配置python manage.py migrate          
# 读取已注册的app下的migrations配置 -> SQL语句  -> 同步数据库
b.连接数据库

市面上的数据库有几种,那么相对应的连接的方式也大有不同,我们先看默认Django在根目录setting.py文件中的默认方法:
image.png
可以很明显的看见sqlite3这个名称,所以,它告诉Django使用SQLite数据库作为默认的数据库引擎,并指定数据库文件的路径为BASE_DIR / ‘db.sqlite3’。BASE_DIR是Django项目的根目录。
sqlite3是Django框架所默认的数据库,关系型的文件数据库。在Django里面需要区分我们不同应用下的表数据,那么就会默认的在表名前面加上应用的名字:
image.png
那么Mysql的连接方式也与其大致相同:

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'xxxxxxxx',  # 数据库名字'USER': 'root','PASSWORD': 'root123','HOST': '127.0.0.1',  # ip'PORT': 3306,}
}

当然,这里我也举例有psycopg2和oracle:

DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql','NAME': 'mydatabase','USER': 'mydatabaseuser','PASSWORD': 'mypassword','HOST': '127.0.0.1','PORT': 5432,}
}# 需要 pip install psycopg2
DATABASES = {'default': {'ENGINE': 'django.db.backends.oracle','NAME': "xxxx",  # 库名"USER": "xxxxx",  # 用户名"PASSWORD": "xxxxx",  # 密码"HOST": "127.0.0.1",  # ip"PORT": 1521,  # 端口}
}
# 需要 pip install cx-Oracle
c.编写类

在app中的models.py中按照规则编写类 ===> 表结构。每一个类就是一张表。
使用Django的ORM操作来生成的表结构之后,尽量不能在数据库里面去对表进行设计操作,想要进行更改在Django项目里面进行修改,修改之后再执行。

-@1-常见字段和参数

那么在Django中的各种常见字段有哪些?参数有哪些?
字段:

CharField		# 字符串,是MySQL里面的varchar类型
TextField		# 文本类型,等同于MySQL里面的text类型SmallIntegerField	# 小整型,和MySQL里面的smallint是等同的
IntegerField		# 标准整型,和MySQL里面的int是等同的
BigIntegerField		# 大整型,和MySQL里面的bigint是等同的
PositiveIntegerField	# 无符号的标准整型,和MySQL里面的bigint无符号是等同的DateField		# 表示年月日
DateTimeField	# 表示年月日时分秒BooleanField  	# 其实数据库不支持真假,根据SmallIntegerField创造出来出来。 0  1FloatField		# 浮点型,等同于MySQL里面的float类型
DecimalField  	# 精确的小数,等同于MySQL里面的decimal类型
#decimal和float的区别:
#decimal:定点数据类型 表示小数   不存在精度误差 涉及到金额,使用定点型
#float:浮点数据类型   表示小数   存在精度误差  涉及到金额都不使用浮点型

参数:

verbose_name #表示备注信息,
max_length  #表示字段的最大的长度
null #表示在数据库里面是否可以为空
blank #表示在页面展示上是否可以为空(admin)
primary key #django里面已经定义好了使用id来作为主键,并且自增长
unique #表示是否是一个唯一值 实际开发过程中(身份证号,手机号...)唯一索引
default #默认值
null #是否为空
blank #页面上是否为空
unique #唯一值
db_index #添加索引
choices # choices=((1, "男"), (2, "女"))存储到数据库的只能是 1和 2,在页面的展示的上男,女
auto_now #是否写入当前时间
max_digits #表示最多可以有多少位数
decimal_places #表示小数点后保留几位

给大家举个例子:

from django.db import modelsclass UserInfo(models.Model):name = models.CharField(verbose_name="姓名", max_length=16, db_index=True,default=None)age = models.PositiveIntegerField(verbose_name="年龄",default=1)email = models.CharField(verbose_name="邮箱", max_length=128, unique=True,default=None)amount = models.DecimalField(verbose_name="余额", max_digits=10, decimal_places=2, default=0)register_date = models.DateField(verbose_name="注册时间", auto_now=True)class Goods(models.Model):title = models.CharField(verbose_name="标题", max_length=32)# detail = models.CharField(verbose_name="详细信息", max_length=255)detail = models.TextField(verbose_name="详细信息")price = models.PositiveIntegerField(verbose_name="价格")count = models.PositiveBigIntegerField(verbose_name="库存", default=0)
-@2-表关系

关系型数据库:

  • 一解决记录实体的属性
  • 二解决记录实体与实体之间的关系

任何开发使用数据库都离不开以下的关系:

  1. 单表关系(日志)
  2. 多表关系
  • 一对一:学生表(学号,姓名,性别)和学生的信息表(学号,爱好,家庭住址,紧急联系人…)
  • 一对多:公司员工表(工号,姓名,性别…),员工权限表(普通员工,主管,经理,董事长)一个员工既是整个公司里面的普通的员工,那么拥有公司普通员工的权限,又是销售部的小组长,那么就拥有销售部的组长的权限…
  • 多对多:男生表,女生表,相亲平台,一个男生在相亲平台上面可以约会多名女生;一个女生也可以在平台上约会多名男生

特别注意:在开发一个小的项目的时候可以使用外键来进行数据的约束,这样可以减少业务逻辑的代码量;但是注意在开发一个大项目,或者你进入的是一个规范的大的公司,坚决不使用外键,因为外键会造成额外的性能消耗
1.外键约束是可以增强数据完整性,但在做INSERT、UPDATE、DELETE时,数据库性能开销成倍增加。
2.外键约束适用于中小应用系统。
3.在大型应用系统中,一般不使用外键约束。而考虑其他方式来增强数据完整性。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R语言进行孟德尔随机化+meta分析(2)----基于R和stata

目前不少文章用到了孟德尔随机化meta分析,在上一章咱们简单介绍了一下meta分析的基础知识。咱们今天来介绍一篇11分文章,由文章看看孟德尔随机化meta分析如何进行,文章的题目是:Appraising the causal role of smoking in multipl…

亲测可用国产GPT人工智能

分享一些靠谱、可用、可以白嫖的GPT大模型。配合大模型,工作效率都会极大提升。 清华大学ChatGLM 官网: 智谱清言中国版对话语言模型,与GLM大模型进行对话。https://chatglm.cn/开源的、支持中英双语的1300亿参数的对话语言模型&#xff0…

ctfshow—1024系列练习

1024 柏拉图 有点像rce远程执行,有四个按钮,分别对应四份php文件,开始搞一下。一开始,先要试探出 文件上传到哪里? 怎么读取上传的文件? 第一步:试探上传文件位置 直接用burp抓包,…

AI智能问答系统源码/AI绘画商业系统/支持GPT联网提问/支持Midjourney绘画

一、AI创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的AI智能问答系统和AI绘画系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图…

jvm 参数配置

查看当前jvm配置参数的值 jsp查看所有的jvm端口 jinfo -flag 参数(XX:后面的) JIT配置 -XX:CompileThreshold在方法调用的默认阈值在客户端1500次,在服务器端10000次。 -XX:-UseCounterDecay用来关闭热度衰减。 -XX:CounterHalfLifeTime设置半衰减的时间&#x…

由于计算机中丢失msvcp110.dll的解决方法与msvcp110.dll丢失修复方法

相信大家在打开电脑软件或许游戏都有遇到过电脑提示找不到msvcp110.dll文件,导致软件游戏打不开,我们应该怎么办?不用着急,今天小编我分享我找了很久成功解决问题的方法给大家,希望可以帮到各位。 1. 使用DLL修复工具&…

C/C++与汇编混合编程

1. C/C调用汇编 C/C想调用汇编代码必须要注意名称修饰的问题 名称修饰(name decoration): 一种标准的C/C编译技术, 通过添加字符来修改函数名, 添加的字符指明了每个函数参数的确切类型。主要是为了支持函数重载, 但对于汇编来说其问题在于, C/C编译器让链接器去找被修饰过的名…

《2023年中国科技论文报告》解读:高校-浙大TOP1,企业-华为TOP1

最近小编看到中国科学技术信息研究所发布了《2023年中国科技论文统计报告》,里面有很多有趣的数据,摘取部分跟大家分享,更多详细内容,请点击文章底部“阅读原文”下载原文件。 第一点:在高水平国际期刊论文排名中&…

【数据结构】排序(2)—冒泡排序 快速排序

目录 一. 冒泡排序 基本思想 代码实现 时间和空间复杂度 稳定性 二. 快速排序 基本思想 代码实现 hoare法 挖坑法 前后指针法 时间和空间复杂度 稳定性 一. 冒泡排序 基本思想 冒泡排序是一种交换排序。两两比较数组元素,如果是逆序(即排列顺序与排序后…

基于matlab创作简易表白代码

一、程序 以下是一个基于MATLAB的简单表白代码: % 表白代码 clc; % 清除命令行窗口 clear; % 清除所有变量 close all; % 关闭所有图形窗口 % 输入被表白者的名字 name input(请输入被表白者的名字:, s); % 显示表白信息 fprintf(\n); fprintf(亲爱的…

visual studio禁用qt-vsaddin插件更新

visual studio里qt-vsaddin插件默认是自动更新的,由于qt-vsaddin插件新版本的操作方式与老版本相差较大,且新版本不稳定,容易出Bug,所以需要禁用其自动更新,步骤如下:     点击VS2019菜单栏上的【扩展】–…

SDL2绘制ffmpeg解析的mp4文件

文章目录 1.FFMPEG利用命令行将mp4转yuv4202.ffmpeg将mp4解析为yuv数据2.1 核心api: 3.SDL2进行yuv绘制到屏幕3.1 核心api 4.完整代码5.效果展示 本项目采用生产者消费者模型,生产者线程:使用ffmpeg将mp4格式数据解析为yuv的帧,消费者线程&am…