Django教程——数据库操作(增删改查)

在上篇文章中我们学习了Django教程——模型,这篇文章学习Django教程——数据库操作(增删改查)。

在学习数据库操作之前,我们需要定义好模型类,模型类代码如下:

from django.db import models
class UserModel(models.Model):# name:CharField字符串类型,最大长度为30,唯一值,索引name = models.CharField(max_length=30, unique=True, db_index=True)# age:IntegerField整数类型,默认值为18age = models.IntegerField(default=18)

定义好模型类后,在终端执行如下命令进行迁移操作,将模型映射到数据库,

python manage.py makemigrations    # 生成迁移文件
python manage.py migrate        # 执行迁移

大家可以参考之前的文章——Django框架——模型来进行上面的步骤。

在url.py文件中编写URL路由绑定代码,如下图所示:

from django.urls import path
from myApp.views import *
urlpatterns = [path('addUser/',add_user),              # 添加数据path('deleteUser/',delete_user),        # 删除数据path('updateUser/', update_user),       # 修改数据path('getUser/', get_user)              # 查询数据
]

我们在views.py文件中编写视图函数实现数据库操作——增删改查,直接访问对应的URL即可。

添加数据

添加单条数据

save方法

from myApp.models import *
def add_user(request):addUser=UserModel()   # 创建模型类实例addUser.name='张三'     # 给模型类中name赋值addUser.age='18'   # 给模型类中age赋值addUser.save()    # 调用save方法,保存数据到数据库

首先创建模型类实例,再给模型类字段赋值,最后调用save方法,将数据保存到数据库中。当然我们也可以将创建模型实例和字段赋值合并在一起,代码如下:

addUser=UserModel(name='李四',age=18)

create方法

使用create方法添加单条数据,其语法格式如下:

模型类.objects.create(字段1='值',字段n='值')

示例代码如下:

UserModel.objects.create(name='王五',age=30)

create方法很简单,通过模型类调用objects再调用create()方法即可添加单条数据到数据库中。

get_or_create方法

由于我们模型类字段中的name设置了唯一值属性,所以在使用save方法或create方法添加重复数据时,会报错,这时我们可以使用get_or_create方法,防止添加重复数据导致报错,其语法格式如下:

模型类.objects.get_or_create(字段1='值',字段n='值')

示例代码如下:

UserModel.objects.get_or_create(name='赵六',age=30)

添加多条数据

添加多条数据与添加单条数据差不多,添加多条数据就是创建多个模型类的实例对象,再将实例对象放在列表中,再使用bulk_create方法添加在数据库中。示例代码如下:

from myApp.models import *
def add_user(request):mylist=[]for i in range(20,30):mylist.append(UserModel(name=f'王{i}',age=i))UserModel.objects.bulk_create(mylist)return HttpResponse('添加成功')

查询数据

方法

查询数据主要有如下5种方法:

方法说明
get()获取单条数据,没有找到符合条件的对象,会引发模型类DoesNotExist错误;找到多个,会引发模型类MultipleObjectsReturned错误
exists()判断查询集中是否有数据,如果有数据返回True,没有数据返回False
filter()类似数据库中的where语句,添加查询条件
exclude()获取查询条件外的数据,相当于not in
all()获取所有数据

其语法格式如下:

模型.objects.get(查询条件)   # 当没查询条件时,若数据只有一条数据时,不会报错
模型.objects.exists()    
模型.objects.filter(查询条件)
模型.objects.exclude(查询条件)
模型.objects.all()

注意:查询数据返回的数据类型为django.db.models.query.QuerySet。

可以在查询语句后面加values()或values_list()方法来获取返回数据的值,其语法格式如下:

values(字段1...,字段n)   # 获取指定字段的值,可以传多个字段,返回包含字典的列表
values_list(字段1...,字段n)      # 获取指定字段的值,可以传多个字段,返回包含元组列表

我们也可以使用获取first()、last()分别获取查询返回值的第一行、最后一行数据。

示例代码如下:

def get_user(request):print(UserModel.objects.filter(age__gt=45).values('name').count())print(UserModel.objects.filter(age__gt=45).values('name').first())print(UserModel.objects.filter(age__gt=45).values_list('name','age').last())return HttpResponse('')

运行结果如下:

4
{'name': '王46'}
('王49',49)

查询操作符

查询数据通常会给出一些查询条件,数值类型查询操作符有:

条件说明
字段__gt=2获取字段值大于2的数据
字段__gte=2获取字段值大于等于2的数据
字段__lt=2获取字段值小于2的数据
字段__lte=2获取字段值小于等于2的数据
字段__in=[1,2,3]获取字段值等于1或2或3的数据
字段__range[1,10]获取字段值在1到10范围的数据

字符串类型查询操作符有:

类型说明
字段__contains='a'获取字段值包含a的数据
字段__icontains='a'获取字段值包含a的数据,大小写不敏感
字段__regex="^a"正则匹配
字段__iregex="^a"正则匹配,忽略大小写
字段__in=['a','b','c']获取字段值等于a或b或c的数据
字段__exact=a获取字段值等于a的数据
字段__iexact=a获取字段值等于a的数据,忽略大小写
字段__endswith=a获取字段值最后一个字符为a的数据
字段__iendswith=a获取字段值最后一个字符为a的数据,忽略大小写
字段__isnull=True获取字段值为空的数据
字段__startswith=a获取字段值第一个字符为a的数据
字段__istartswith=a获取字段值第一个字符为a的数据,忽略大小写

示例代码如下:

def get_user(request): print(UserModel.objects.all().values())   # 获取所有数据 print(UserModel.objects.filter(age__gt=25).values_list())  # 获取age字段大于45的值return HttpResponse('')

访问http://127.0.0.1:8000/getUser/结果如下:

<QuerySet [{'id': 35, 'name': '王40', 'age': 40}, {'id': 36, 'name': '王41', 'age': 41}, {'id': 37, 'name': '王42', 'age': 42}, {'id': 38, 'name': '王43', 'age': 43}, {
'id': 39, 'name': '王44', 'age': 44}, {'id': 40, 'name': '王45', 'age': 45}, {'id': 41, 'name': '王46', 'age': 46}, {'id': 42, 'name': '王47', 'age': 47}, {'id': 43, 'name': '王48', 'age': 48}, {'id': 44, 'name': '王49', 'age': 49}]>
<QuerySet [(41, '王46', 46), (42, '王47', 47), (43, '王48', 48), (44, '王49', 49)]>

排序

我们可以使用order_by()方法对查询结果进行排序,示例代码如下:

def get_user(request): print(UserModel.objects.all().values().order_by('name'))   # 获取所有数据并升序排序 print(UserModel.objects.all().values().order_by('-name'))   # 获取所有数据并降序排序return HttpResponse('') 

运行结果如下:

<QuerySet [{'id': 35, 'name': '王40', 'age': 40}, {'id': 36, 'name': '王41', 'age': 41}, {'id': 37, 'name': '王42', 'age': 42}, {'id': 38, 'name': '王43', 'age': 43}, {
'id': 39, 'name': '王44', 'age': 44}, {'id': 40, 'name': '王45', 'age': 45}, {'id': 41, 'name': '王46', 'age': 46}, {'id': 42, 'name': '王47', 'age': 47}, {'id': 43, 'name': '王48', 'age': 48}, {'id': 44, 'name': '王49', 'age': 49}]>
<QuerySet [{'id': 44, 'name': '王49', 'age': 49}, {'id': 43, 'name': '王48', 'age': 48}, {'id': 42, 'name': '王47', 'age': 47}, {'id': 41, 'name': '王46', 'age': 46}, {
'id': 40, 'name': '王45', 'age': 45}, {'id': 39, 'name': '王44', 'age': 44}, {'id': 38, 'name': '王43', 'age': 43}, {'id': 37, 'name': '王42', 'age': 42}, {'id': 36, 'name': '王41', 'age': 41}, {'id': 35, 'name': '王40', 'age': 40}]>

聚合

在查询返回的数据集中,我们可以使用aggregate()方法传递函数统计返回的数据集,常用的函数有:

函数说明
Avg平均值
count数量
Max最大
Min最小
Sum求和

示例代码如下:

from django.db.models import Max,Min,Sum
def get_user(request):print(UserModel.objects.aggregate(Max('age')))print(UserModel.objects.aggregate(Min('age')))print(UserModel.objects.aggregate(Sum('age')))print(UserModel.objects.all().count())return HttpResponse('')

运行结果如下:

{'age__max': 49}
{'age__min': 40}
{'age__sum': 445}
10

删除数据

删除数据是在查询数据的基础上添加delete()方法,示例代码如下:

def delete_user(request):UserModel.objects.filter(name='王46').delete()return HttpResponse('删除成功')

这样即可删除name为王46的数据。

修改数据

修改数据可以使用save()方法或update()方法

save方法

使用save方法修改数据需要通过查询语句获取要修改的数据,再对数据进行修改,最后调用save()方法保存,示例代码如下:

def update_user(request):# 修改第一条数据updateUser=UserModel().objects.first()updateUser.age=666updateUser.save()# 修改指定数据updateUser=UserModel.objects.filter(name='王47')updateUser.name='王222'updateUser.save(update_fields=['name'])       # 自定修改数据的字段return HttpResponse('')

在调用save方法中,添加update_fields参数可以一定程度上提高修改的效率。

update方法

使用update方法修改数据会相对简洁一些,示例代码如下:

def update_user(request):UserModel.objects.filter(name='王222').update(name='王47')return HttpResponse('修改成功')

这样就成功修改了数据。

好了,Django框架——数据库操作(增删改查)就学习到这里。

公众号:白巧克力LIN

该公众号发布Python、数据库、Linux、Flask、Django、自动化测试、Git、算法、前端、服务器等相关文章!

- END -

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

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

相关文章

OS复习笔记ch7-1

存储的基本管理需求 重定位 重定位(Relocation)&#xff1a;需要解决可执行文件中地址&#xff08;指令和数据&#xff09;和内存地址的对应。 一般有两种比较常见的重定位方式&#xff1a; 静态重定位(static relocation)&#xff1a;当程序被装入内存时&#xff0c;一次性…

Python pdf2imges -- pdf文件转图片

pdf文件转图片&#xff0c;需要安装PyMuPDF包&#xff0c;具体PyMuPDF包介绍可以参考&#xff1a;Python 处理 PDF 的神器 -- PyMuPDF import fitz # pip install PyMuPDF# PDF转换为IMG统一管理 def pdf_to_images(pdf_path, img_path, filename):"""pdf_p…

Mac系统国内通过nvm快速安装node

国内通过nvm安装node 国内nvm安装工具 地址&#xff1a;https://gitee.com/RubyMetric/nvm-cn 安装命令 bash -c "$(curl -fsSL https://gitee.com/RubyMetric/nvm-cn/raw/main/install.sh)"如果按照过程中有报错可以尝试下载安装脚本 在浏览器中打开下面的链接htt…

【头歌】计算机网络DHCP服务器配置第四关配置路由器子接口答案

头歌计算机网络DHCP服务器配置第四关配置路由器子接口操作步骤 任务描述 本关任务&#xff1a;配置路由器的子接口。 操作要求 在第一关的拓扑图的基础上&#xff0c;配置路由器及 PC 机&#xff0c;具体要求如下&#xff1a; 1、打开路由器物理接口 F0/0 &#xff1b; 2、配置…

【科普】关于Cookie的一点知识

【科普】关于Cookie的一点知识 1. Cookie的传输方式2. 不设置Domain时的默认逻辑3. SameSite设置为None的风险4. 通过IP访问时如何设置Cookie 1. Cookie的传输方式 Cookie是通过HTTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;安全超文本传输协议&#xff09;…

NSSCTF中的pop、babyupload、cve版本签到、奇妙的MD5、easy_html

目录 [SWPUCTF 2021 新生赛]pop [NISACTF 2022]babyupload ​编辑[GKCTF 2020]cve版签到 [SWP5UCTF 2022 新生赛]奇妙的MD5 [HNCTF 2022 Week1]easy_html 今日总结&#xff1a; [SWPUCTF 2021 新生赛]pop 1.代码审计 <?phperror_reporting(0); show_source("…

装机必备——360压缩安装教程

装机必备——360压缩安装教程 软件下载 软件名称&#xff1a;360压缩 软件语言&#xff1a;简体中文 软件大小&#xff1a;3.38M 系统要求&#xff1a;Windows7或更高&#xff0c; 32/64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM4G或更高 下载通道①迅雷云盘丨…

Linux性能优化-网络篇

文章目录 前言一、网络性能指标二、网络基准测试如何评估系统的网络性能各协议层的性能测试转发性能TCP/UPD性能HTTP性能应用负载性能 三、网络指标的获取查询带宽网络吞吐和PPS网络连通 总结 前言 如何评价一套新环境内主机和应用的网络性能&#xff0c;有哪些指标需要注意&a…

跳跃游戏(2)

问题描述 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 输入&#xff1…

DINO结构中的exponential moving average (ema)和stop-gradient (sg)

DINO思路介绍 在 DINO 中&#xff0c;教师和学生网络分别预测一个一维的嵌入。为了训练学生模型&#xff0c;我们需要选取一个损失函数&#xff0c;不断地让学生的输出向教师的输出靠近。softmax 结合交叉熵损失函数是一种常用的做法&#xff0c;来让学生模型的输出与教师模型的…

Flutter 中的 AnimatedDefaultTextStyle 小部件:全面指南

Flutter 中的 AnimatedDefaultTextStyle 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;AnimatedDefaultTextStyle 是一个用于动画化默认文本样式的组件&#xff0c;它可以在文本显示期间平滑地过渡文本样式&#xff0c;如字体大小、颜色和字体族。这在实现复杂的文本…

pytorch应该安装哪个nvcc -V 还是 nvidia-smi 对比的cuda?

当使用nvidia-smi时会显示 cuda driver版本&#xff0c;如下&#xff1a; NVIDIA-SMI 510.47.03 Driver Version: 510.47.03 CUDA Version: 11.6 当使用 nvcc -V 时会显示 cuda runtime version&#xff0c;如下&#xff1a; nvcc: NVIDIA (R) Cuda compiler driver …

Docker安装Oracle11g数据库

操作系统&#xff1a;centOS9使用此方法检查是否安装Docker&#xff1a;docker --help&#xff0c;如果有帮助文件则证明安装成功使用此语句检查Docker是否正在运行&#xff1a;docker images&#xff0c;实际上是查看本地镜像如果发现未运行则开启Docker&#xff1a;systemctl…

普华永道调查:“拥抱AI”的行业正呈现出生产率激增景象

全球知名四大会计师事务所之一的普华永道最新报告显示&#xff0c;一些最有可能将人工智能技术融入业务的企业&#xff0c;其生产率增长速度几乎是其他行业的5倍&#xff0c;这有望推动整体经济。周二&#xff08;5月21日&#xff09;发布的报告称&#xff0c;2018年至2022年间…

MyCat2之安装与配置文件介绍

安装 1.新建文件夹tools mkdir tools&#xff0c;并进入tools 2.下载MaCat wget http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.21.zip wget http://dl.mycat.org.cn/2.0/1.21-release/mycat2-1.21-release-jar-with-dependencies.jar 3.解压zip u…

怎样打造一份个性化画册呢?我来教你

在这个数字化的时代&#xff0c;传统的照片已经不能满足我们对个性化回忆的需求。个性化画册&#xff0c;不仅能够承载我们的记忆&#xff0c;还能展现自我风格。今天&#xff0c;就让我来教你如何打造一份属于自己的个性化画册。 1.要制作电子杂志,首先需要选择一款适合自己的…

kafka3.6.1版本学习

kafka目录结构 bin linux系统下可执行脚本文件 bin/windows windows系统下可执行脚本文件 config 配置文件 libs 依赖类库 licenses 许可信息 site-docs 文档 logs 服务日志 启动ZooKeeper 进入Kafka解压缩文件夹的config目录&#xff0c;修改zookeeper.properties配置文件 #t…

【吊打面试官系列】Java高并发篇 - Java 死锁以及如何避免?

大家好&#xff0c;我是锋哥。今天分享关于 【Java 死锁以及如何避免&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Java 死锁以及如何避免&#xff1f; Java 中的死锁是一种编程情况&#xff0c;其中两个或多个线程被永久阻塞&#xff0c;Java 死锁情况出现至…

【每日刷题】Day50

【每日刷题】Day50 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 654. 最大二叉树 - 力扣&#xff08;LeetCode&#xff09; 2. 119. 杨辉三角 II - 力扣&#xff08…

「动态规划」粉刷房子

力扣原题链接&#xff0c;点击跳转。 假设有n个房子&#xff0c;每个房子可以粉刷成红色、蓝色或者绿色。相邻2个房子不能刷同一种颜色。下标为i的房子粉刷成下标为j的颜色的价格是costs[i][j]。至少需要花多少钱&#xff1f; 我们用动态规划的思想来解决这个问题。首先定义状…