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.pswp.cn/bicheng/18037.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18037.shtml
英文地址,請注明出處:http://en.pswp.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; 我們用動態規劃的思想來解決這個問題。首先定義狀…