Django框架之ORM操作

一、选择数据库

1、默认数据库

  • Django默认的数据库是sqlite3数据库
DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': BASE_DIR / 'db.sqlite3',}
}

2、指定数据库

  • 修改连接到MySQL数据库
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql',# 数据库名字'NAME': "user_data",# 数据库用户名"USER": "root",# 数据库密码"PASSWORD": "111111",# 数据库 IP,本地默认是127.0.0.1/localhost"HOST": "127.0.0.1",# 数据库端口"PORT": 3306,# 数据库编码"CHARSET": "utf8mb4",}
}

3、指定MySQL数据库报错

django 默认使用mysqldb模块链接mysql,但是该模块的兼容性不好,需要手动修改为pymysql链接

(1)解决办法一:猴子补丁

  • 在项目下的 __init__ 或者任意的应用名下的 __init__ 文件中书写一下代码
import pymysqlpymysql.install_as_MySQLdb()

(2)解决办法二:下载第三方模块

  • 直接安装
pip install mysqlclient
  • 运气好不会报错,但是运气不好就会报错
    • 报错的话下载whl文件
    • https://pypi.org/project/mysqlclient/#files
    • 下载对应的whl版本文件并安装
pip install pip mysqlclient-2.2.4-cp310-cp310-win_amd64.whl

二、连接数据库

  • 首先如下图,点击Database

在这里插入图片描述

  • 第二步,如下图

在这里插入图片描述

  • 第三步,填写相关信息

在这里插入图片描述

  • 第四步,不要着急确定,先点击Test Connection,看看是否能够连接成功

在这里插入图片描述

  • 最后,点击OK连接数据库成功

三、ORM介绍

1、什么是ORM

ORM(Object-Relational Mapping)是一种编程技术,用于在关系型数据库和面向对象编程语言之间建立映射关系,从而实现数据的持久化和操作。ORM工具可以将数据库中的表和记录映射到编程语言中的对象和属性,使开发人员可以使用面向对象的方式来操作数据库,而无需直接编写SQL语句。

简单来说,就是

  • 数据库中的表映射为Python中的类
  • 数据库中的字段映射为Python中的属性
  • 数据库中的记录映射为Python中的实例

2、使用Django ORM的好处

Django ORM(Object-Relational Mapping)是Django框架内置的ORM工具,用于简化与数据库的交互和操作。以下是使用Django ORM的一些优点:

  1. 简单易用:Django ORM提供了简单易用的API,使开发人员能够使用Python对象来表示数据库表和记录,从而减少了编写SQL语句的需要。

  2. 自动化数据库表创建:通过定义Django模型类,Django ORM可以自动创建对应的数据库表结构,无需手动编写SQL语句创建表。

  3. 数据关系管理:Django ORM支持定义数据之间的关系,如一对多、多对多等关系,开发人员可以轻松地处理复杂的数据关系。

  4. 查询表达式:Django ORM提供了丰富的查询表达式和方法,使开发人员能够轻松地执行各种复杂的数据库查询操作,如过滤、排序、分组等。

  5. 事务支持:Django ORM提供了事务管理的功能,确保数据库操作的原子性和一致性,避免数据不一致的情况发生。

  6. 性能优化:Django ORM提供了查询优化的功能,可以通过使用索引、延迟加载等技术来提高查询性能。

  7. 跨数据库支持:Django ORM支持多种数据库后端,开发人员可以在不同的数据库系统之间切换而无需修改大部分代码。

  8. 安全性:Django ORM可以防止SQL注入攻击,因为它会自动转义用户输入的数据,从而提高应用程序的安全性。

  9. 可扩展性:Django ORM支持自定义查询集、管理器和查询表达式,开发人员可以根据需要扩展其功能。

总的来说,Django ORM简化了与数据库的交互,提高了开发效率,同时提供了丰富的功能和性能优化选项,使开发人员能够更轻松地构建功能强大的Web应用程序。

四、ORM操作之建表

1、定义模型表

  • 应用下面的models.py文件
  • 数据库中的表映射为Python中的类
class User(models.Model):"""数据库中的字段映射为Python中的属性定义一个用户名 : 字符串类型 长度MySQL中字符串类型的字段 : char varchar(32)CharField :字符串类型的字段max_length :最大长度verbose_name : 注释help_text : 解释"""# username varchar(32)username = models.CharField(max_length=32, verbose_name="用户名", help_text="这是一个用户名字段")password = models.CharField(max_length=32)# IntegerField : 相当于MySQL中的 int 字段age = models.IntegerField()# FloatField : 相当于MySQL数据库中的 float 字段salary = models.FloatField()

2、数据库迁移

(1)命令行输入,生成迁移文件

python manage.py makemigrations

(2)迁移记录生效,同步到数据库中

python manage.py migrate

(3)注意事项

只要你修改了models.py中跟数据库中相关的代码,就必须重新执行上述的两条命令。

由于一张表中必须要有一个主键字段,并且一般情况下都叫id字段,所以ORM在当你不定义主键字段的时候,ORM会自动帮你创建一个名为id的主键字段,但是如果需要额外的叫法例如uid,aid等等,那么就需要自己手动去创建了

(4)补充

  • pycharm帮助我们偷懒的办法,直接点击下方按钮

在这里插入图片描述

  • 然后直接输入makemigrations和migrate即可

在这里插入图片描述

  • 最后我们在Database上就能看见各种表了

在这里插入图片描述

五、ORM操作之字段操作

1、字段的增加

要在 Django 模型表中增加新的字段,只需在相应的 Model 类中添加新字段及其类型和所需属性。

(1) 可以在终端内直接给出默认值(2) 设置该字段可以为空
info = models.CharField(max_length=32,verbose_name='个人简介',null=True)(3) 直接给字段设置默认值
hobby = models.CharField(max_length=32,verbose_name='兴趣爱好',default='study')  

2、 字段的修改

直接修改代码然后执行数据库迁移的两条命令即可

python manage.py makemigrations
python manage.py migrate

3、字段的删除

直接注释对应的字段然后执行数据库迁移的两条命令即可,但是执行完之后字段对应的数据也都没有了

所以在操作models.py的时候一定要注意:
千万不要轻易的注释一些字段,执行迁移命令之前最好先检查一下自己写的代码

六、ORM操作之数据操作

1、数据增加

(1)方式一

res = models.User.objects.create(username="张三",password=123456)
# res 就是当前被创建的对象本身

(2)方式二

user_obj = models.User(username=username,password=password)
user_obj.save()  # 保存数据

2、数据查询

(1)获取全部数据的方式

模型表名.objects.all()

(2)获取特定数据的方式

filter括号内可以携带多个参数,参数与参数之间默认是and关系,可以把filter联想成where记忆

# 方式一
模型表名.objects.get(筛选字段名=筛选字段值)# 方式二
res = models.User.objects.filter(username="张三")
print(res)  #  # <QuerySet [<User: User object (1)>]>  [数据对象1,数据对象2,...]
user_obj = res[0]"""
返回值可以先看成事列表套数据对象的格式。
它支持索引取值,切片操作,但是不支持负数索引;但是它不推荐你使用索引的方式取值
user_obj = models.User.objects.filter(username=username).first()
"""

(3)去除指定条件后的数据

模型表名.objects.exclude(筛选字段名=筛选字段值)

(4)示例

# 获取表中所有数据
all_records = MyModel.objects.all()# 根据特定条件筛选数据(方式一)
filtered_records = MyModel.objects.get(name="张三")# 根据特定条件筛选数据(方式二)
# 查询包含"张"的所有name
filtered_records = MyModel.objects.filter(name__contains="张")  # 去除满足指定条件的数据
# 过滤掉所有年龄小于18岁的记录
excluded_records = MyModel.objects.exclude(age__lt=18) 

(5)补充

.filter()  过滤-->Queryset对象   
.first() .last()-->获取用户对象
.get()  直接拿到的就是用户对象

3、数据修改

(1)先查询直接修改

  • 推荐使用
模型表名.objects.filter(筛选字段名=筛选字段值).update(修改字段名=修改字段值)

(2)先查询后,再修改,最后保存

obj = 模型表名.objects.get(筛选字段名=筛选字段值)
obj.修改字段名=修改字段值
obj.save()

(3)示例

# 点击编辑按钮朝后端发送编辑数据的请求"""如何告诉后端用户想要编辑哪条数据?将编辑按钮所在的哪一行数据的主键值发送给后端利用url问号后面携带参数的方式"""
def edit_user(request):# 获取url后面的参数edit_id = request.GET.get('user_id')# 查询当前用户想要编辑的数据对象edit_obj = models.User.objects.filter(id=edit_id).first()if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')# 去数据库中修改对应的数据内容# 修改方式1models.User.objects.filter(id=edit_id).update(username=username,password=password)"""将filter查询出来的列表中所有的对象全部更新  批量更新操作只修改被修改的字段,推荐使用"""# 修改方式2edit_obj.username = usernameedit_obj.password = passwordedit_obj.save()"""上述方法当字段特别多的时候效率会非常的低因为它是从头到尾将数据的所有字段全部更新一遍,无论该字段是否被修改"""# 跳转到数据的展示页面return redirect('/user_list/')# 将数据对象展示到页面上return render(request,"05 edit_user.html",locals())

4、数据删除

(1)先查询直接删除

模型表名.objects.filter(筛选字段名=筛选字段值).delete()

(2)先查询再删除

instance_to_delete = MyModel.objects.get(筛选字段名=筛选字段值)
instance_to_delete.delete()

(3)示例

# 删除满足特定条件的记录,通常先通过查询获取对象实例再调用 .delete() 方法
instance_to_delete = MyModel.objects.get(name="张三")
instance_to_delete.delete()# 可以使用 .filter() 方法批量删除
MyModel.objects.filter(name="李四").delete()  # 删除所有名字为"李四"的记录

(4)了解

删除数据内部其实并不是真正的删除,我们会给数据添加一个标识字段用来表示当前数据是否被删除了,如果数据被删了仅仅只是将字段修改了一个状态

七、Django ORM中如何创建表关系

1、表与表之间的关系

  • 一对多

  • 多对多

  • 一对一

判断表关系的方法:换位思考

2、创建表关系

  • 思路:先将基表创建出来,然后再添加外键字段
  • 思考:ORM中如何定义三种关系?
publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE) 
authors = models.ManyToManyField(to='Author')
author_detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)

其中ForeignKey、OneToOneField会自动在字段后面加_id后缀,还需要手动加上 on_delete=models.CASCADE 来标识级联更新和删除(Django1.x版本不需要手动添加)

from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=32)price = models.DecimalField(max_digits=8, decimal_places=2)# 总共8位,小数点后面占2位"""图书和出版社是一对多,并且书是多的一方,所以外键字段放在书表里面"""publish = models.ForeignKey(to='Publish')  # to_field不写默认就是与出版社表的主键字段做外键关联"""如果字段对应的是ForeignKey,那么ORM会自动在字段的后面加_id如果你自己加了_id,那么ORM还是会在后面继续加_id因此后面在定义ForeignKey的时候就不要自己加_id""""""图书和作者是多对多的关系,外键字段建在任意一方均可,但是推荐你建在查询频率较高的一方"""authors = models.ManyToManyField(to='Author')"""authors是一个虚拟字段,主要是用来告诉ORM,书籍表和作者表是多对多关系让ORM自动帮你创建第三张关系表"""class Publish(models.Model):name = models.CharField(max_length=32)addr = models.CharField(max_length=32)class Author(models.Model):name = models.CharField(max_length=32)age = models.IntegerField()"""作者与作者详情是一对一的关系,外键字段建在任意一方均可,但是推荐你建在查询频率较高的一方"""author_detail = models.OneToOneField(to='AuthorDetail')"""OneToOneField也会自动给字段加_id后缀"""class AuthorDetail(models.Model):phone = models.BigIntegerField()  # 或者直接用字符类型addr = models.CharField(max_length=32)

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

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

相关文章

一、安装Redis并运行

Windows安装Redis 1.打开网址下载 下载地址&#xff1a;https://github.com/tporadowski/redis/releases。 Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择 我选择的是 然后一步步安装 可以参考&#xff1a;https://blog.csdn.net/zbx931197485/article/d…

李廉洋:4.29黄金原油最新走势分析,做单必看策略,

传统定价框架下&#xff0c;黄金兼具货币、商品和金融三重属性&#xff0c;对应货币、抗通胀和避险价值&#xff0c;因此通常与美元、美债利率反向变动。但近期这一定价规律“失灵”了&#xff0c;黄金、利率和美元同涨。三者同涨后&#xff0c;一个月后续转为下跌的频率超过一…

JS - 以工厂模式和原型模式方式建造对象、JS的垃级回收机制、数组的使用

创建对象的方式 使用工厂方法来建造对象 在JS中我们可以通过以下方式进行创建对象&#xff1a; var obj {name:"孙悟空",age:18,gender:"男",sayName:function(){alert(this.name);}};var obj2 {name:"猪八戒",age:28,gender:"男",…

【Java EE】总结12种锁策略以及synchronized的实现原理

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

基于yolov5实时实例分割

是一个结合了最新技术进展&#xff08;State-of-the-Art, SOTA&#xff09;的实时实例分割项目&#xff0c;基于著名的YOLOv5目标检测架构&#xff0c;并对其进行扩展以实现对图像中每个对象实例的精确像素级分割。以下是该项目的中文介绍&#xff1a; YOLOv5&#xff1a; YOL…

Java后端利用百度地图全球逆地理编码,获取地址

声明&#xff1a;本人是在实习项目的时候遇到的问题 一.使用Api分为四步骤全球逆地理编码 rgc 反geo检索 | 百度地图API SDK 步骤1,2自行完成 接下来去获取AK 二.申请AK 登录百度账号 点击创建应用&#xff0c;选择自己想用的服务&#xff0c;我只单选了逆地理编码&#xff…

go语言实现简单认证样例

目录 1、代码实现样例 2、postman调用 1、代码实现样例 package mainimport ("net/http""strings""github.com/dgrijalva/jwt-go""github.com/gin-gonic/gin" )var (// 密钥&#xff0c;用于验证 JWT 令牌signingKey []byte("…

【1762】java校园单车投放系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目

一、源码特点 java校园单车投放管理系统是一套完善的java web信息管理系统 采用serlvetdaobean&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S 模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#…

C语言基础知识笔记——万字学习记录

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要参考浙大翁恺老师的C语言讲解以及其他博主的C语言学习笔记&#xff0c;进而梳理C语言的基础知识&#xff0c;为后续系统性学习数据结构和其他语言等知识夯实一定的基础。&#xff08;其他博主学习笔记的链接包括&#x…

网络服务SSH-远程访问及控制

一.SSH远程管理 1.SSH介绍 SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;最早是由芬兰的一家公司开发出来&#xff0c;并且在IETF &#xff08;Internet Engineering Task Force&#xff09;的网络草案基础上制定而成的标准协议。主要用来实现字符…

案例-部门管理-删除

黑马程序员JavaWeb开发教程 文章目录 一、查看页面原型二、查看接口文档三、开发1、Controller2、Service&#xff08;1&#xff09;service接口层&#xff08;3&#xff09;service实现层 3、Mapper4、Postman 一、查看页面原型 二、查看接口文档 三、开发 1、Controller 因…

短视频账号“四部定位法”,让流量噌噌上涨 沈阳短视频剪辑培训

在当下短视频的风潮中&#xff0c;企业纷纷涉足这一领域&#xff0c;希望通过短视频平台吸引用户、提升品牌知名度、促进销售转化。 然而&#xff0c;面对海量的内容和激烈的竞争&#xff0c;企业如何才能在短视频领域脱颖而出&#xff1f; 在企业涉足短视频领域之前&#xf…

用友裁应届

下半年准备来用友的24应届生们&#xff0c;请三思&#xff01;&#xff01;&#xff01; 我是23届某9研究生&#xff0c;2月份用友以绩效低为由被裁&#xff08;我一个应届生跟老员工比绩效&#xff0c;搞笑呢&#xff09;。 半年被裁&#xff0c;找工作太难了&a…

# 使用 spring boot 时,@Autowired 注解 自动装配注入时,变量报红解决方法:

使用 spring boot 时&#xff0c;Autowired 注解 自动装配注入时&#xff0c;变量报红解决方法&#xff1a; 1、使用 Resource 代替 Autowired 注解&#xff0c;根据类型注入改为根据名称注入&#xff08;建议&#xff09;。 2、在 XXXMapper 上添加 Repository 注解&#xff0…

区块链技术:NFG元宇宙电商模式

大家好&#xff0c;我是微三云周丽 随着互联网技术的迅猛发展&#xff0c;电子商务行业逐渐崛起为现代经济的重要支柱。而在这一浪潮中&#xff0c;元宇宙电商以其独特的商业模式和巨大的发展潜力&#xff0c;成为行业的新宠。其中&#xff0c;NFG作为元宇宙电商模式的代表&am…

单链表-java

此次我们主要通过数组来模拟一下单链表&#xff0c;并完成一些基本的功能。 文章目录 前言 一、单链表 二、思路模拟 1.引入变量解释 2.链表初始化 3.在头结点后插入一个结点 4.表示在第k个数后面插入一个数 5. 把第k个数后面的一个数删除掉 三、代码如下 1.代码如下&#xff1…

NDK 入门(二)—— 调音小项目

NDK 入门系列主要介绍 JNI 的相关内容&#xff0c;目录如下&#xff1a; NDK 入门&#xff08;一&#xff09;—— JNI 初探 NDK 入门&#xff08;二&#xff09;—— 调音小项目 NDK 入门&#xff08;三&#xff09;—— JNI 注册与 JNI 线程 NDK 入门&#xff08;四&#xff…

数字滤波器设计笔记1

系统结构 1.先利用matlab的simulink和FDA进行滤波器建模设计&#xff0c;通过仿真后&#xff0c;确定模型达到相应的性能要求&#xff0c;再利用verilog进行电路设计。最后使用modelsim进行功能验证。其中testbench的输入数据&#xff0c;利用matlab模型的输入数据。 2.Matlab…

最最普通程序员,如何利用工资攒够彩礼,成为人生赢家

今天我们不讲如何提升你的专业技能去涨工资&#xff0c;不讲面试技巧如何跳槽涨工资&#xff0c;不讲如何干兼职赚人生第一桶金&#xff0c;就讲一个最最普通的程序员&#xff0c;如何在工作几年后&#xff0c;可以攒够彩礼钱&#xff0c;婚礼酒席钱&#xff0c;在自己人生大事…

pytho爬取南京房源成交价信息并导入到excel

# encoding: utf-8 # File_name: import requests from bs4 import BeautifulSoup import xlrd #导入xlrd库 import pandas as pd import openpyxl# 定义函数来获取南京最新的二手房房子成交价 def get_nanjing_latest_second_hand_prices():cookies {select_city: 320100,li…