Django之ORM操作初了解

news2025/1/12 19:04:21

文章开篇,我们首先复习下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  1

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

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

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

相关文章

Word-首行缩进2字符设置只缩进一个汉字的问题

1.点击“文件”中的“选项” 2.点击“选项”中的“语言” 将 中文&#xff08;简体&#xff09;<首选> 放在第一个即可

【量化】量化原理浅析

前言 模型在端侧运行时&#xff0c;会追求模型保持原有精度的同时&#xff0c;让模型的运行速度更快。基本方向为模型压缩和加速&#xff0c;着力于减少网络参数量、降低计算复杂度。可通过以下方式实现&#xff1a; 针对网络结构本身进行改进&#xff0c;常用的3x3的卷积的叠加…

已解决 Bug——SyntaxError: Unexpected token o in JSON at position 1问题

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

读书笔记|《数据压缩入门》—— 柯尔特·麦克安利斯 亚历克斯·海奇

前言&#xff1a;在接触文本隐写研究领域时了解到这本书。本书可算作《数据压缩》的入门书籍之一&#xff0c;这本书对熵编码、变长编码、统计编码、自适应统计编码、字典编码、上下文编码等常用编码方式的定义及来源进行介绍&#xff0c;对不同场景下不同格式的压缩数据有针对…

2023-10-03 LeetCode每日一题(买卖股票的最佳时机 III)

2023-10-03每日一题 一、题目编号 123. 买卖股票的最佳时机 III二、题目链接 点击跳转到题目位置 三、题目描述 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 **注意…

【考研英语】2011 年英语(一)排序题思路复盘(费曼学习法)

文章目录 引言一、找语段特征词二、确定位置写在最后 引言 英语一中的新题型之一 —— 排序题&#xff0c;我是看的刘琦老师的方法课&#xff0c;她用的 2011 年的真题来讲解方法。讲完让我们回去用“费曼学习法”复盘以下&#xff0c;我个人感觉是一个不错的方法&#xff0c;…

leetCode 45.跳跃游戏 II 贪心算法

45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 &…

踩坑笔记 MySQL分页排序查询(Order by limit)导致数据丢失和重复

文章目录 背景现象原因解决方案 背景 分页查询排序后的数据&#xff0c;是一个非常常见的业务场景&#xff1b;但当使用不唯一的字段排序时&#xff0c;分两页查询的数据可能出现数据重复和丢失的错觉。 在执行查询时&#xff0c;MySQL会根据查询优化器的决策来确定数据的检索…

RabbitMQ安装与简单使用

安装 下载资源 可以访问官网查看下载信息rabbitmq官网 选择合适的版本&#xff0c;注意&#xff1a;rabbitmq需要下载一个Erlang才能使用 我自己是在一下两个连接中下载的 rabbitmq 3.8.8 erlang 21.3.8.15 需要下载其他版本的同学注意erlang版本是否匹配&#xff0c;可以访…

axb_2019_brop64

axb_2019_brop64 Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000)64位&#xff0c;只开了NX __int64 repeater() {size_t v1; // raxchar s[208]; // [rsp0h] [rbp-D0h] BYREFprintf("…

1200*C. Make It Good(二分 || 贪心)

Make It Good - 洛谷 Problem - 1385C - Codeforces 思路一&#xff1a; 二分答案&#xff0c;每次check从mid1开始&#xff0c;判断能否形成要求的序列。 #include<bits/stdc.h> using namespace std; #define int long long const int N2e55; int t,n,a[N]; bool che…

栈的应用场景(三)

最小栈 1.题目2.画图分析3.代码实现 1.题目 2.画图分析 3.代码实现 package Stack;import java.util.Stack; public class MinStack {private Stack <Integer> stack;private Stack <Integer> MinStack;public MinStack() {stack new Stack<>();MinStack …

JAVA学习(2)-全网最详细~

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

jarvisoj_level5

jarvisoj_level5 Arch: amd64-64-little RELRO: No RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x3fe000)64位&#xff0c;只开了NX ssize_t vulnerable_function() {char buf[128]; // [rsp0h] [rbp-80h] BYREFwrite(1, "Input:\…

【网络通信三要素】TCP与UDP快速入门

网络通信三要素 1.什么是网络编程&#xff1f; 可以让设备中的程序&#xff0c;与网络上其他设备中的程序进行数据交互&#xff0c;从而实现网络通信的手段&#xff0c;java.net.*包下提供了网络编程的解决方案 2.基本的通信架构 基本的通信架构有2种形式&#xff1a;CS架构…

【Spring MVC】MVC如何浏览器请求(service方法)

文章目录 1. DispatcherServlet 的 service 方法1.1. processRequest 方法1.2. doService 方法 背景&#xff1a;平时我们学习 MVC 重点关注的时DispatcherServlet 的 doDispatcher 方法&#xff0c;但是在 doDispatcher 方法之前 还有请求处理的前置过程&#xff0c;这个过程…

javaWeb学生信息管理

一、引言 学生信息管理系统是基于Java Web技术开发的一个全栈应用&#xff0c;用于管理学生的基本信息。本系统采用Eclipse作为开发工具&#xff0c;Navicat用于MySQL数据库管理&#xff0c;运行在JDK1.8、Tomcat9.0、MySQL8.0环境下。前端采用JavaScript、jQuery、Bootstrap4…

大语言模型之十四-PEFT的LoRA

在《大语言模型之七- Llama-2单GPU微调SFT》和《大语言模型之十三 LLama2中文推理》中我们都提到了LoRA&#xff08;低秩分解&#xff09;方法&#xff0c;之所以用低秩分解进行参数的优化的原因是为了减少计算资源。 我们以《大语言模型之四-LlaMA-2从模型到应用》一文中的图…

14:00面试,14:06就出来了,这问的过于变态了。。。

前言 刚从小厂出来&#xff0c;没想到在另一家公司我又寄了。 在这家公司上班&#xff0c;每天都要加班&#xff0c;但看在钱给的比较多的份上&#xff0c;也就不太计较了。但万万没想到5月一纸通知&#xff0c;所有人不准加班了&#xff0c;不仅加班费没有了&#xff0c;薪资…

Linux: 进程(控制)

目录 1.进程的创建 1.1fork函数 1.2fork创建子进程,OS做了什么&#xff1f; 1.3为什么要写实拷贝&#xff1f; 2.进程的终止 2.1进程终止&#xff0c;操作系统做了什么&#xff1f; 2.2进程常见的退出方式 2.3进程常见的退出方法 3.进程的等待 3.1为什么进行进程等待…