Django之ORM操作初了解

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

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

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

一)基本知识

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

总结来看,ORM的开发效率高,执行效率低。

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

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

  1. 在我们根目录中的setting.py中可以看见如下代码以连接数据库:
  2. 在根目录中的setting.py中注册app:
  1. 编写models.类
python 复制代码
INSTALLED_APP = [
	...
	"app01.apps.App01Config"
]
  1. 执行命令

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

python 复制代码
python manage.py makemigrations   
# 找到所有已注册的app中的models.py中的类读取 -> migrations配置

python manage.py migrate          
# 读取已注册的app下的migrations配置 -> SQL语句  -> 同步数据库
b.连接数据库

市面上的数据库有几种,那么相对应的连接的方式也大有不同,我们先看默认Django在根目录setting.py文件中的默认方法:

可以很明显的看见sqlite3这个名称,所以,它告诉Django使用SQLite数据库作为默认的数据库引擎,并指定数据库文件的路径为BASE_DIR / 'db.sqlite3'。BASE_DIR是Django项目的根目录。

sqlite3是Django框架所默认的数据库,关系型的文件数据库。在Django里面需要区分我们不同应用下的表数据,那么就会默认的在表名前面加上应用的名字:

那么Mysql的连接方式也与其大致相同:

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

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

python 复制代码
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': 5432,
    }
}

# 需要 pip install psycopg2
python 复制代码
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中的各种常见字段有哪些?参数有哪些?

字段:

python 复制代码
CharField		# 字符串,是MySQL里面的varchar类型
TextField		# 文本类型,等同于MySQL里面的text类型

SmallIntegerField	# 小整型,和MySQL里面的smallint是等同的
IntegerField		# 标准整型,和MySQL里面的int是等同的
BigIntegerField		# 大整型,和MySQL里面的bigint是等同的
PositiveIntegerField	# 无符号的标准整型,和MySQL里面的bigint无符号是等同的

DateField		# 表示年月日
DateTimeField	# 表示年月日时分秒

BooleanField  	# 其实数据库不支持真假,根据SmallIntegerField创造出来出来。 0  1

FloatField		# 浮点型,等同于MySQL里面的float类型
DecimalField  	# 精确的小数,等同于MySQL里面的decimal类型
#decimal和float的区别:
#decimal:定点数据类型 表示小数   不存在精度误差 涉及到金额,使用定点型
#float:浮点数据类型   表示小数   存在精度误差  涉及到金额都不使用浮点型

参数:

python 复制代码
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 #表示小数点后保留几位

给大家举个例子:

python 复制代码
from django.db import models


class 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.在大型应用系统中,一般不使用外键约束。而考虑其他方式来增强数据完整性。

相关推荐
知识分享小能手1 小时前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019数据库的操作(2)
数据库·学习·sqlserver
爬山算法1 小时前
Hibernate(84)如何在DevOps流程中使用Hibernate?
oracle·hibernate·devops
踩坑小念2 小时前
秒杀场景下如何处理redis扣除状态不一致问题
数据库·redis·分布式·缓存·秒杀
萧曵 丶2 小时前
MySQL 语句书写顺序与执行顺序对比速记表
数据库·mysql
Wiktok3 小时前
MySQL的常用数据类型
数据库·mysql
曹牧3 小时前
Oracle 表闪回(Flashback Table)
数据库·oracle
J_liaty4 小时前
Redis 超详细入门教程:从零基础到实战精通
数据库·redis·缓存
m0_706653234 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python
山岚的运维笔记4 小时前
SQL Server笔记 -- 第15章:INSERT INTO
java·数据库·笔记·sql·microsoft·sqlserver
Lw老王要学习5 小时前
CentOS 7.9达梦数据库安装全流程解析
linux·运维·数据库·centos·达梦