Django基础(六)———数据库

前言

上篇文章给大家介绍了DTL模板结构

这篇文章将讲述Django框架与MySQL数据库的综合使用


一、Django配置连接数据库

在操作数据库之前,首先先要连接数据库,这里我们以配置MySQL为例来讲解。Diango连接数据库,不需要单独的创建一个连接对象。 只需要在 settings.py 文件中做好数据库相关的配置就可以了。

二、在Django中操作数据库(原生SQL语句操作)

在Django 中操作数据库有两种方式。第一种方式就是使用原生SQL语句操作,第二种就是使用ORM模型来操作。
在Django中使用原生 SQL 语句操作其实就是使用 python db api的接口来操作。如果你的mysql驱动使用的是pymysql,那么你就是使用 pymysql来操作的,只不过Django将数据库连接的这一部分封装好了,我们只要在 settings.py中配置好了数据库连接信息后直接使用Diango封装好的接口就可以操作了。

1.安装pymysql

pip install pymysql

2.在init.py文件当中写上如下代码

import pymysql
pymysql.install_as_MySQLdb()

3.编写视图函数

#app应用下的 view.py
def index(request):#获取游标对象cursor = connection.cursor()#拿到游标对象后执行sql语句cursor.execute("select * from cangku")#获取所有数据rows = cursor.fetchall()#便利查询for row in rows:print(row)return HttpResponse("查找成功")

4.编写路由

#app应用下的 urls.py
from django.urls import path
from . import viewsapp_name = 'app'
urlpatterns = [path('cangku',views.index,name='index')
]
#database应用下的 urls.py
from django.contrib import admin
from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('app/',include("app.urls"))
]

三、ORM模型介绍

1.ORM模型介绍

随着项目越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了

  1. SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长。会出现很多相近的SQL语句。

  2. 很多SQL语句是在业务逻辑中拼出来的,如果有数据库需要更改,就要去修改这些逻辑,这会很容易漏掉对某些SQL语句的修改。

  3. 写SQL时容易忽略web安全问题,给未来造成隐患。SQL注入。

ORM,全称object Relational Mapping,中文叫做对象关系映射,通过 ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句。通过把表映射成类,把行作实例,把字段作为属性,ORM在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。使用ORM有许多优点:

  1. 易用性:使用ORM做数据库的开发可以有效的减少重复SQL语句的概率,写出来的模型也更加直观、清晰.

  2. 性能损耗小:ORM转换成底层数据库操作指令确实会有一些开销。但从实际的情况来看,这种性能损耗很少(不足5%),只要不是对性能有严苛的要求,综合考虑开发效率、代码的阅读性,带来的好处要远远大于性能损耗,而且项目越大作用越明显。

  3. 设计灵活:可以轻松的写出复杂的查询。

  4. 可移植性: Django封装了底层的数据库实现,支持多个关系数据库引擎,包括流行的MySQL、PostgresQL和 SQLite。可以非常轻松的切换数据库。

2.创建ORM模型

ORM模型一般都是放在 app的 models.py文件中。每个app都可以拥有自己的模型。并且如果这个模型想要映射到数据库中,那么这个 app必须要放在settings.py的INSTALLED_APP 中进行安装。以下是写一个简单的仓库ORM 模型。

#app应用中 models.py文件
from django.db import models
#电子产品
class Dianzichanpin(models.Model):objects = Nonename = models.CharField(max_length=100)factory =models.CharField(max_length=100)pub_time = models.DateTimeField(auto_now_add=True)price = models.FloatField(default=0)

3.映射模型到数据库中

将 ORM 模型映射到数据库中,总结起来就是以下几步:

  1. 在settings.py中,配置好 DATABASES,做好数据库相关的配置,

  2. 在 app 中的 mode1s.py中定义好模型,这个模型必须继承自 django.db.models。

  3. 将这个app添加到settings.py的INSTALLED_APP中。

  4. 在命令行终端,进入到项目所在的路径,然后执行命令 python manage.py makemigrations 来生成迁移脚本文件。

  5. 同样在命令行中,执行命令 python manage.py migrate 来将迁移脚本文件映射到数据库中。

四、CRUD操作

在 ORM框架中,所有模型相关的操作,比如添加/删除等。其实都是映射到数据库中一条数据的操作。因此模型操作也就是数据库表中数据的操作。

1.添加一个模型到数据库当中

编写视图函数

#app应用下 views.py
def add(request):Dianzi =Dianzichanpin(name='手机',factory='福建',price=1200)Dianzi.save()return HttpResponse("图书插入成功")

编写路由

#app应用下的 urls.pypath('add',views.add,name='add')

2.查找数据

查找数据都是通过模型下的 objects 对象来实现的。

2.1查找所有数据

要查找 Dianzichanpin 这个模型对应的表下的所有数据。

编写视图函数

#app应用下 views.py
def query(request):Dianzi = Dianzichanpin.objects.all()for Dian in Dianzi:print(Dian.id,Dian.name,Dian.pub_time,Dian.price)return  HttpResponse("查找成功")

编写路由

#app应用下的 urls.pypath('query',views.query,name='query')

2.2数据过滤

在查找数据的时候,有时候需要对一些数据进行过滤。那么这时候需要调用objects的 filter 方法。

编写视图函数

def query(request):# Dianzi = Dianzichanpin.objects.all()Dianzi = Dianzichanpin.objects.filter(name='手机')for Dian in Dianzi:print(Dian.id,Dian.name,Dian.pub_time,Dian.price)return  HttpResponse("查找成功")

2.3获取单个对象(多用于登陆注册)

使用 filter返回的是所有满足条件的结果集。有时候如果只需要返回第一个满足条件的对象。那么可以使用 get方法。

编写视图函数

def query(request):Dianzi = Dianzichanpin.objects.get(name='手机')print(Dianzi.name)return  HttpResponse("查找成功")

2.4数据排序

在之前的例子中,数据都是无序的。如果你想在査找数据的时候使用某个字段来进行排序,那么可以使用order_by方法来实现。

编写视图函数

def query(request):Dianzi = Dianzichanpin.objects.order_by("pub_time")for Dian in Dianzi:print(Dian.name)return  HttpResponse("查找成功")

默认为从小到大排列,如果想要倒叙,在对应数据前面放上-号

3.修改数据

在查找到数据后,便可以进行修改了。修改的方式非常简单,只需要将查找出来的对象的某个属性进行修改,然后再调用这个对象的 save 方法便可以进行修改。

编写视图函数

def update(reuqest):Dianzi = Dianzichanpin.objects.first()Dianzi.name ='耳机'Dianzi.save()return HttpResponse('修改成功')

编写路由

#app应用下的 urls.py
path('update',views.update,name='update')

4.删除数据

在查找到数据后,便可以进行删除了。删除数据非常简单,只需要调用这个对象的 delete方法即可

编写视图函数

def delete_(request):Dianzi = Dianzichanpin.objects.get(name='电子手表')Dianzi.delete()return HttpResponse('删除成功')

编写路由

path('delete',views.delete_,name='delete')

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

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

相关文章

postgresql使用记录 SCRAM authentication requires libpq version 10 or above

文章目录 背景 如何用命令行连接数据库 报错 原因 解决方案 psql常见命令 🔍 **核心数据库操作命令** 1. **查看所有数据库** 2. **切换数据库** 3. **查看表及结构** 4. **执行 SQL 文件** 5. **退出 psql** ⚙️ **高级管理命令** ️ **注意事项** 背景 由于某种原因,无法…

2.0版本seata、nacos+ruoyi(微服务)配置

一、下载: seata下载:点击这里 nacos下载:点击这里 ruoyi(微服务)下载:点击这里 Git bash下载:点击这里 本文所用的版本: seata-2.2.0(下图红色框框)&a…

面试高频题 力扣 LCR 130.衣柜整理 洪水灌溉(FloodFill) 深度优先遍历(dfs) 暴力搜索 C++解题思路 每日一题

目录零、题目描述一、为什么这道题值得一看?二、题目拆解:核心要素与约束三、算法实现:基于 DFS 的解决方案代码逻辑拆解五、时间复杂度与空间复杂度时间复杂度空间复杂度六、坑点总结七、举一反三八、洪水灌溉(Flood Fill&#x…

Ext4文件系统全景解析

目录Ext4文件系统全景解析:从inode到数据恢复实战1. Ext文件系统的"小区规划":块组结构详解 🏘️1.1 块组:文件系统的基本管理单元1.2 超级块的"多重备份"机制 🛡️2. inode:文件的&qu…

贪心算法Day4学习心得

先来看第一道:860. 柠檬水找零 - 力扣(LeetCode) 有如下三种情况: 情况一:账单是5,直接收下。情况二:账单是10,消耗一个5,增加一个10情况三:账单是20&#…

接口自动化测试种涉及到接口依赖怎么办?

《接口自动化测试中接口依赖的处理方式及选择原则》在接口自动化测试中,接口依赖是指某个接口的请求参数、执行条件或测试结果依赖于其他接口的输出(如返回数据、状态等)。处理接口依赖是确保测试用例准确性和稳定性的关键,常见的…

hive分区表临时加载日批数据文件

源系统每日上传一个csv数据文件到数据中台指定目录,数据中台用hive表进行ETL工作。 先建一个外部分区表: create external table tmp_lease_contract ( contract_id string, vin string, amount float ) partitioned by (dt string) row format delim…

Python关于pandas的基础知识

一.扫盲(一)、pandas 是什么pandas 是 Python 的一个第三方数据处理库,它提供了高效、灵活的数据结构(如 Series 和 DataFrame),能方便地对结构化数据进行清洗、转换、分析和处理。(二&#xff…

React 英语单词补全游戏——一个寓教于乐的英语单词记忆游戏

预览:英语单词补全 📖 产品概述 英语单词大冒险是一款专为 7-12 岁儿童设计的互动式英语学习游戏。通过听音频、补全单词的游戏方式,让孩子在轻松愉快的环境中提升英语词汇能力和听力水平。 🎯 核心价值主张 寓教于乐: 将枯燥…

我的第一个开源项目 -- 实时语音识别工具

这是我的第一个开源项目,是我一直想做的一个小工具: 端到端实时语音转文字系统。 通过小程序和H5页面,用户可以实时采录音频,通过ws上传到java的netty server。 Java在经过权限验证、流量控制等操作之后,通过gRPC流…

AG32 mcu+cpld 联合编程(概念及流程)

在使用mcucpld联合编程之前,请确认已经熟练掌握mcu的使用方法,并且对cpld编程(verilog语言)有一定的基础。 另外,对AHB总线也需要有一定的了解。 这个章节分为两部分: 第一部分,展示联合编程…

Hadoop调度器深度解析:FairScheduler与CapacityScheduler的优化策略

Hadoop调度器概述在大数据处理的生态系统中,Hadoop作为分布式计算框架的核心,其资源调度机制直接决定了集群的吞吐效率和作业执行公平性。调度器作为Hadoop资源管理的中枢神经,通过协调计算资源与任务需求之间的动态平衡,成为支撑…

怎么自己搭建云手机

用闲置电脑搭建云手机 确保电脑安装 Ubuntu 20.04(或其他支持Docker的Linux系统)。 安装 Docker(运行云手机的核心工具)安装Redroid(安卓容器)运行安卓容器就欧克啦。 用云服务器搭建(适合长…

网关:数据翻译、中转、协议转换与边缘计算

网关(Gateway)详解:翻译与中转站的核心作用 在计算机网络中,网关(Gateway)是一个非常重要的概念。它本质上是一个“翻译中转站”,其主要作用是将不同网络之间的数据进行“翻译”,并确…

UE5多人MOBA+GAS 番外篇:使用ECC(UGameplayEffectExecutionCalculation)制作伤害计算的流程

文章目录定义一些属性用于作为伤害基础还有获取要打出去的伤害创建一个ECC(里面执行伤害的计算)在执行ECC的GE之前需要修改ECC需要调用的值,也可以不改直接计算在属性中监听ECC输出的那个值然后处理扣血定义一些属性用于作为伤害基础还有获取…

SpringBoot实战0-5

接口文档:通俗的讲,接口文档能告诉开发者接口能返回的数据,以及为了获取这些数据,开发者需要输入什么样的数据,请求哪个接口(即规范)为什么使用接口文档:1、项目开发过程中前后端工程…

二、SpringBoot-REST开发

rest开发(表现形式转换): 1、优点:隐藏访问资源的行为,无法通过地址得知对资源是何种操作,书写简化 2、GET查询 POST 新增/保存 PUT(修改/更新) DELETE(删除)…

大数据之路:阿里巴巴大数据实践——离线数据开发

数据开发平台 统一计算平台MaxCompute:主要服务于海量数据的存储和计算 ,提供完善的数据导入方案, 以及多种经典的分布式计算模型,提供海量数据仓库的解决方案,能够更快速地解决用户的海量数据计算问题,有效…

我的网页聊天室设计

一、需求分析1.用户管理模块注册功能实现一个注册页面。注册页面上包含了一个输入框,输入用户名和密码. 注册成功后可以跳转到登录页面.登录功能实现一个登录页面。登录页面上包含一个输入框。输入用户名和密码. 登录成功后可以跳转到主页面.2.主界面用户信息左上角…

数据结构自学Days10 -- 二叉树的常用实现

✅ 一、为什么要学习二叉树? 1. 📦 组织数据的高效方式 二叉树可以快速插入、删除、查找数据,尤其在平衡时,时间复杂度为 $O(\log n)$。 适合表示分层结构(如组织结构、文件系统、语法树)。 2. &#x…