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.xdnf.cn/news/147809.html

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

相关文章

react 网页/app复制分享链接到剪切板,分享到国外各大社交平台,通过WhatsApp方式分享以及SMS短信方式分享链接内容

1.需求 最近在做一个国际网站app,需要把app中某个页面的图文链接分享到国外各大社交平台上(facebook,whatapp,telegram,twitter等),以及通过WhatApp聊天方式分享,和SMS短信方式分享链接内容,该怎么做呢?图示如下: 分享到国外各大社交平台&am…

DS线性表之链表

前言 我们上一期介绍了顺序表,它的底层就是数组,我们也分别对顺序表的动态版本和静态版本进行了实现!并且分析了顺序表的优缺点,优点是:尾插、尾删效率很高,其时间复杂度是O(1);缺点是&#xff…

代码随想录算法训练营第五十五天 | 动态规划 part 12 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

目录 300.最长递增子序列思路代码 674. 最长连续递增序列思路代码 718. 最长重复子数组思路代码 300.最长递增子序列 Leetcode 思路 dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度递推公式:if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1)初…

格点数据可视化(美国站点的日降雨数据)

获取美国站点的日降雨量的格点数据,并且可视化 导入模块 from datetime import datetime, timedelta from urllib.request import urlopenimport cartopy.crs as ccrs import cartopy.feature as cfeature import matplotlib.colors as mcolors import matplotli…

解决u盘在我的电脑中重复显示两个

删除注册表: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\DelegateFolders\{F5FB2C77-0E2F-4A16-A381-3E560C68BC83}]

postgresql-备份与恢复

postgresql-备份与恢复 基本概念备份类型物理备份与逻辑备份在线备份与离线备份全量备份与增量备份 备份恢复工具备份与恢复逻辑备份与还原备份单个数据库psqlpg_dumppg_store 备份整个集群 基本概念 服务器系统错误、硬件故障或者人为失误都可能导致数据的丢失或损坏。因此&am…

Redis学习笔记(下):持久化RDB、AOF+主从复制(薪火相传,反客为主,一主多从,哨兵模式)+Redis集群

十一、持久化RDB和AOF 持久化:将数据存入硬盘 11.1 RDB(Redis Database) RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。 备份…

vtk 动画入门 1 代码

实现效果如图&#xff1a; #include <vtkAutoInit.h> //VTK_MODULE_INIT(vtkRenderingOpenGL2); //VTK_MODULE_INIT(vtkInteractionStyle); VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle); //VTK_MODULE_INIT(vtkRenderingFreeType); #in…

新手学习笔记-----编译和链接

目录 1. 翻译环境和运⾏环境 2. 翻译环境&#xff1a;预编译编译汇编链接 2.1 预处理 2.2 编译 2.2.1 词法分析 2.2.2 语法分析 2.2.3 语义分析 2.3 汇编 2.4 链接 3. 运⾏环境 1. 翻译环境和运⾏环境 在ANSI C的任何⼀种实现中&#xff0c;存在两个不同的环境。 第…

JSON的MIME媒体类型是application/json

JSON&#xff08;全称 JavaScript Object Notation&#xff09;即JavaScript对象表示法&#xff0c;通知使用application/json媒体类型。 目录 1、JSON介绍 2、JSON语法 3、实践总结 运行环境&#xff1a; Windows-7-Ultimate-x64、Windows-10-BusinessEditions-21h2-x64 1…

Can‘t pickle <class ‘__main__.Test‘>: it‘s not the same object as __main__.Test

目录 原因1 类名重复了 案例1 变量名和类名重复 原因1 类名重复了 检查项目代码&#xff0c;是不是其他地方有同名类。 案例1 变量名和类名重复 转自&#xff1a;python3报错Cant pickle <class __main__.Test>: its not the same object as __main__.Test解决 - 知乎…

SpringBoot Validation入参校验国际化

在 Spring Boot 中&#xff0c;可以使用 Validation 和国际化来实现对入参的校验。 常用的校验 NotNull验证字段值不能为 nullNotEmpty验证字段值不能为 null 或空字符串NotBlank验证字符串字段值不能为空、null&#xff0c;并且必须至少包含一个非空白字符Size验证字符串、…

lv8 嵌入式开发-网络编程开发 01什么是互联网

目录 1 计算机网络的定义与分类 1.1 按照网络的作用范围进行分类 1.2 按照网络的使用者进行分类 2 网络的网络 2.1 名词解释 2.2 边缘与核心 3 互联网基础结构发展的三个阶段 3.1 第一阶段&#xff1a;1969 – 1990 3.2 第二阶段&#xff1a;1985 – 1993 3.3 第三阶…

小谈设计模式(14)—建造者模式

小谈设计模式&#xff08;14&#xff09;—建造者模式 专栏介绍专栏地址专栏介绍 建造者模式角色分类产品&#xff08;Product&#xff09;抽象建造者&#xff08;Builder&#xff09;具体建造者&#xff08;Concrete Builder&#xff09;指挥者&#xff08;Director&#xff0…

Java之SpringCloud Alibaba【六】【Alibaba微服务分布式事务组件—Seata】

一、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。 在关系数据库中&#xff0c;一个事务由一组SQL语句组成。 事务应该具有4个属性: 原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。 原子性(atomicity) ∶个事务…

Selenium上传文件有多少种方式?不信你有我全

Selenium 封装了现成的文件上传操作。但是随着现代前端框架的发展&#xff0c;文件上传的方式越来越多样。而有一些文件上传的控件&#xff0c;要做自动化控制会更复杂一些&#xff0c;这篇文章主要讨论在复杂情况下&#xff0c;如何通过自动化完成文件上传 1.input 元素上传文…

国庆作业6

TCP服务器 #include "head.h" #define PORT 2580 //端口号 #define IP "192.168.31.219" //本机IP int main(int argc, const char *argv[]) {sqlite3* dbNULL;if(sqlite3_open("./my.db",&db)!SQLITE_OK){fprintf(stde…

Python大数据之PySpark(四)SparkBaseCore

文章目录 SparkBase&Core环境搭建-Spark on YARN扩展阅读-Spark关键概念[了解]PySpark角色分析[了解]PySpark架构后记 SparkBase&Core 学习目标掌握SparkOnYarn搭建掌握RDD的基础创建及相关算子操作了解PySpark的架构及角色 环境搭建-Spark on YARN Yarn 资源调度框…

面试题:熟悉设计模式吗?谈谈简单工厂模式和策略模式的区别

刚刚接触设计模式的时候&#xff0c;我相信单例模式和工厂模式应该是用的最多的&#xff0c;毕竟很多的底层代码几乎都用了这些模式。自从接触了一次阿里的公众号发的一次文章关于 DDD的使用 以后&#xff0c;就逐渐接触了策略模式。现在在项目中运用最多的也是这几种设计模式了…

【深蓝学院】手写VIO第4章--基于滑动窗口算法的 VIO 系统:可观性和 一致性--笔记

0. 内容 T1. 参考SLAM14讲P247直接可写&#xff0c;注意 ξ 1 , ξ 2 \xi_1,\xi_2 ξ1​,ξ2​之间有约束&#xff08;关系&#xff09;。 套用舒尔补公式&#xff1a; marg掉 ξ 1 \xi_1 ξ1​之后&#xff0c;信息被传递到 L 1 和 L 2 L_1和L_2 L1​和L2​之间了。 T2.