django 單表操作實(shí)例詳解
前面視圖層,模板層、路由層都寫(xiě)了大概,項(xiàng)目肯定是會(huì)和數(shù)據(jù)庫(kù)打交道,那就講講orm的單表查詢(xún)吧,直接寫(xiě)過(guò)一點(diǎn)點(diǎn),不太全面。
1、項(xiàng)目剛創(chuàng)建好,我們需要在settings里配置一下(用mysql數(shù)據(jù)庫(kù)),配置好了,再去app文件夾里的__init__配置下,其實(shí)在
哪個(gè)__init__配置都一樣,項(xiàng)目啟動(dòng)時(shí),首先是執(zhí)行__init__文件。下面直接貼代碼了。
setting文件里:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD': '', 'NAME': 'zhuyu', } }
__init__文件里:
import pymysql pymysql.install_as_MySQLdb() #還是寫(xiě)寫(xiě)為什么吧,前面也寫(xiě)過(guò),再寫(xiě)一次。 #首先django里mysql用的是MySQLdb,但是python3.x現(xiàn)在不支持MySQLdb了,所引在項(xiàng)目啟動(dòng)時(shí),將MySQLdb轉(zhuǎn)成pymysql #你是python2.x的可以不用寫(xiě)。
2、上面的配置配置好了,你就可以在models.py寫(xiě)orm了,我以Student為例
class Student(model.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) age = models.CharField(max_length=32) balance = models.CharField(max_length=32)
3、數(shù)據(jù)庫(kù)遷移命令我就不寫(xiě)了,對(duì)數(shù)據(jù)庫(kù)操作無(wú)非就是增刪改查
增加:
方式一:
ret = models.Student.object.create(name='zhuyu',age=21,balance='5000') #這里的ret是學(xué)生對(duì)象
方式二:
zhanghao = models.Student(name='zhanghao',age=22,balance='4000) zhanghao.save() #先實(shí)例一個(gè)學(xué)生對(duì)象,再調(diào)用學(xué)生對(duì)象的方法,我們沒(méi)寫(xiě),調(diào)用的肯定是它基類(lèi)的方法。
修改:
方式一:
ret = models.Student.object.filter(name='zhuyu').update(balance='9999) #返回值ret是對(duì)數(shù)據(jù)庫(kù)影響的行數(shù), #a = models.Student.object.filter(name='zhuyu'),a是一個(gè)queryset對(duì)象,所以u(píng)pdate是它的一個(gè)方法
方式二:
那么我Student對(duì)象有沒(méi)有update方法呢?
ret = models.Student.object.filter(name='zhuyu').first().update(balance='9999')
答案是會(huì)報(bào)錯(cuò)的?。。。?!,記住對(duì)象是沒(méi)有update方法的?。。。?!
那我對(duì)象怎么修改呢?
ret = models.Student.object.filter(name='zhuyu').first() ret.balance = '8888' ret.save() #很簡(jiǎn)單,拿到修改對(duì)象,該屬性值,調(diào)用save()方法就行
刪除:
ret = models.Student.object.filter(name='zhuyu') ret.delete() #這里的ret是queryset對(duì)象,調(diào)用的是它的delete方法
繼續(xù)上面的方法,對(duì)象有沒(méi)有delete方法呢?
ret = models.Student.object.filter(name='zhuyu').first() ret.delete() #ret就是學(xué)生對(duì)象了,結(jié)果顯示能成功刪除!所以對(duì)象是有delete方法
增刪改上面就寫(xiě)完了,下面主要寫(xiě)寫(xiě)查詢(xún)吧。
1、all 查詢(xún)所有的結(jié)果:
ret = models.Student.object.all() #ret是queryset對(duì)象
2、filter 篩選符合條件的:
ret = models.Student.object.filter(name='zhuyu') # ret為queryset對(duì)象,姑且就是一個(gè)列表吧,裝著一個(gè)一個(gè)對(duì)象
3、first 查詢(xún)符合條件的第一個(gè)對(duì)象
ret = models.Student.object.filter(balance='5000').first() # ret沒(méi)啥好說(shuō)的,一個(gè)對(duì)象,上面寫(xiě)了queryset對(duì)象姑且為列表,那么就可以索引取值了, # 我們?cè)倏磃irst()方法,它是取了queryset對(duì)象的索引0最為返回值,那么我也可以取 ret = models.Student.object.filter(balance='5000')[0] # 注意:是可以通過(guò)索引取值,但是索引不能為負(fù)數(shù)??!
4、last 查詢(xún)符合條件的最后一個(gè)對(duì)象
ret = models.Student.object.filter(balance='2000').last() # ret是學(xué)生對(duì)象,前面不是說(shuō)queryset對(duì)象是不能取負(fù)數(shù)嘛,那最后一個(gè)用-1 # 肯定會(huì)報(bào)錯(cuò),那么last怎么實(shí)現(xiàn)的呢? # reverse查詢(xún)的結(jié)果進(jìn)行反轉(zhuǎn),看下面這句代碼 ret = models.Student.object.filter(balance='2000').reverse().first() # last()原理就是這樣實(shí)現(xiàn)的
5、exclude 篩選出不符合條件的
ret = models.Student.object.exclude(age=20) # ret 為queryset對(duì)象 # exclude和filter一樣,可以跟多個(gè)條件,用逗號(hào)分開(kāi) ret = models.Student.object.exclude(age=20,name='zhuyu') # 查詢(xún)出不是name為朱宇,并且年齡為20的所有學(xué)生,相當(dāng)于and
6、count 查看queryset對(duì)象里的個(gè)數(shù)
ret = models.Student.object.all() # ret為一個(gè)整型
7、order_by 排序
# 以學(xué)生年齡從小到大排序 ret = models.Student.object.order_by('age') # ret為queryset對(duì)象 # 以學(xué)生年齡從大到小排序 ret = models.Student.object.order_by('-age') # 我認(rèn)為實(shí)現(xiàn)方法為,先取出一個(gè)條件(也就是字符串),取索引0,看是否為'-',是的話 # 取索引1到最后為條件,再轉(zhuǎn)換sql語(yǔ)句時(shí),ASC改為DESC,排序方式改變。
8、reverse 結(jié)果取反
ret = models.Student.object.order_by('age').reverse() # ret為queryset對(duì)象,年齡從大到小排序。
9、exists 判斷queryset對(duì)象里是否有數(shù)據(jù)嘛
它的返回值就是True False
10、values和values_list
values:它是queryset對(duì)象的方法,它的返回值也是queryset對(duì)象,里面是一個(gè)大列表裝著一個(gè)一個(gè)字典
字典里的key就是values里的值
values_list:queryset對(duì)象的方法,它的返回值也是queryset對(duì)象,里面是一個(gè)大列表一個(gè)一個(gè)元組,元組的值就是values_list里所取到的值。
11、distinct 去重,不用多說(shuō)了,queryset對(duì)象的方法。
12、get 也是取出符合條件的一個(gè),但是那個(gè)條件必須是唯一的,必須存在的。
假如:取出叫zhuyu的學(xué)生,叫zhuyu的學(xué)生不止一個(gè),那么你用get就會(huì)報(bào)錯(cuò)取出叫dsb的學(xué)生,如果沒(méi)有,你用get就會(huì)出錯(cuò)。
上面就是一些單表查詢(xún)的方法,發(fā)現(xiàn)沒(méi)有,為何每個(gè)返回值,我都要寫(xiě)什么類(lèi)型,大多數(shù)就是queryset類(lèi)型,所以只要前面
是queryset對(duì)象,我們都可以用到它的方法,比如:取出學(xué)生balance為5000,且按照年齡從小到大排序。
下面寫(xiě)寫(xiě)基于雙下劃線的模糊查詢(xún)
# 查詢(xún)學(xué)生年齡為12,16,13的學(xué)生 models.Student.object.filter(age__in=[13,13,16]) # 查詢(xún)學(xué)生年齡大于12的學(xué)生 models.Student.object.filter(age__gt=12) # 查詢(xún)學(xué)生年齡小于12的學(xué)生 models.Student.object.filter(age__lt=12) # 查詢(xún)學(xué)生年齡大于等于12的學(xué)生 models.Student.object.filter(age__gte=12) # 查詢(xún)學(xué)生年齡小于等于12的學(xué)生 models.Student.object.filter(age__lte=12) # 查詢(xún)學(xué)生名字中有宇的學(xué)生 models.Student.object.filter(name__contains='宇') # 查詢(xún)學(xué)生名字以朱開(kāi)頭的學(xué)生 models.Student.object.filter(name__startswith='朱')
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
pycharm之英文輸入法變成全角字符無(wú)法輸入問(wèn)題
這篇文章主要介紹了pycharm之英文輸入法變成全角字符無(wú)法輸入問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11python出現(xiàn)"IndentationError: unexpected indent"錯(cuò)誤解決辦法
這篇文章主要介紹了python出現(xiàn)"IndentationError: unexpected indent"錯(cuò)誤解決辦法的相關(guān)資料,希望通過(guò)本文能解決遇到這樣的問(wèn)題,需要的朋友可以參考下2017-10-10淺談Pycharm最有必要改的幾個(gè)默認(rèn)設(shè)置項(xiàng)
今天小編就為大家分享一篇淺談Pycharm最有必要改的幾個(gè)默認(rèn)設(shè)置項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02Python中的if、else、elif語(yǔ)句用法簡(jiǎn)明講解
這篇文章主要介紹了Python中的if、else、elif語(yǔ)句的用法講解,條件判斷語(yǔ)句是程序中流程控制的基礎(chǔ)辦法之一,需要的朋友可以參考下2016-03-03Python實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Python sqlite3事務(wù)處理方法實(shí)例分析
這篇文章主要介紹了Python sqlite3事務(wù)處理方法,結(jié)合具體實(shí)例形式分析了Python針對(duì)sqlite3事務(wù)處理的操作技巧,代碼中包含詳盡的注釋,需要的朋友可以參考下2017-06-06Python實(shí)現(xiàn)郵件發(fā)送功能的示例詳解
Python對(duì)SMTP支持有smtplib和email兩個(gè)模塊,email負(fù)責(zé)構(gòu)造郵件,smtplib負(fù)責(zé)發(fā)送郵件。本文將以qq郵箱為例,實(shí)現(xiàn)自己給自己發(fā)送郵件的功能,感興趣的可以了解一下2022-11-11