前面視圖層,模板層、路由層都寫了大概,項目肯定是會和數據庫打交道,那就講講orm的單表查詢吧,直接寫過一點點,不太全面。
1、項目剛創建好,我們需要在settings里配置一下(用mysql數據庫),配置好了,再去app文件夾里的__init__配置下,其實在
哪個__init__配置都一樣,項目啟動時,首先是執行__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()
#還是寫寫為什么吧,前面也寫過,再寫一次。
#首先django里mysql用的是MySQLdb,但是python3.x現在不支持MySQLdb了,所引在項目啟動時,將MySQLdb轉成pymysql
#你是python2.x的可以不用寫。
2、上面的配置配置好了,你就可以在models.py寫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、數據庫遷移命令我就不寫了,對數據庫操作無非就是增刪改查
增加:
方式一:
ret = models.Student.object.create(name='zhuyu',age=21,balance='5000')
#這里的ret是學生對象
方式二:
zhanghao = models.Student(name='zhanghao',age=22,balance='4000)
zhanghao.save()
#先實例一個學生對象,再調用學生對象的方法,我們沒寫,調用的肯定是它基類的方法。
修改:
方式一:
ret = models.Student.object.filter(name='zhuyu').update(balance='9999)
#返回值ret是對數據庫影響的行數,
#a = models.Student.object.filter(name='zhuyu'),a是一個queryset對象,所以update是它的一個方法
方式二:
那么我Student對象有沒有update方法呢?
ret = models.Student.object.filter(name='zhuyu').first().update(balance='9999')
答案是會報錯的?。。。?!,記住對象是沒有update方法的?。。。?!
那我對象怎么修改呢?
ret = models.Student.object.filter(name='zhuyu').first()
ret.balance = '8888'
ret.save()
#很簡單,拿到修改對象,該屬性值,調用save()方法就行
刪除:
ret = models.Student.object.filter(name='zhuyu')
ret.delete()
#這里的ret是queryset對象,調用的是它的delete方法
繼續上面的方法,對象有沒有delete方法呢?
ret = models.Student.object.filter(name='zhuyu').first()
ret.delete()
#ret就是學生對象了,結果顯示能成功刪除!所以對象是有delete方法
增刪改上面就寫完了,下面主要寫寫查詢吧。
1、all 查詢所有的結果:
ret = models.Student.object.all()
#ret是queryset對象
2、filter 篩選符合條件的:
ret = models.Student.object.filter(name='zhuyu')
# ret為queryset對象,姑且就是一個列表吧,裝著一個一個對象
3、first 查詢符合條件的第一個對象
ret = models.Student.object.filter(balance='5000').first()
# ret沒啥好說的,一個對象,上面寫了queryset對象姑且為列表,那么就可以索引取值了,
# 我們再看first()方法,它是取了queryset對象的索引0最為返回值,那么我也可以取
ret = models.Student.object.filter(balance='5000')[0]
# 注意:是可以通過索引取值,但是索引不能為負數??!
4、last 查詢符合條件的最后一個對象
ret = models.Student.object.filter(balance='2000').last()
# ret是學生對象,前面不是說queryset對象是不能取負數嘛,那最后一個用-1
# 肯定會報錯,那么last怎么實現的呢?
# reverse查詢的結果進行反轉,看下面這句代碼
ret = models.Student.object.filter(balance='2000').reverse().first()
# last()原理就是這樣實現的
5、exclude 篩選出不符合條件的
ret = models.Student.object.exclude(age=20)
# ret 為queryset對象
# exclude和filter一樣,可以跟多個條件,用逗號分開
ret = models.Student.object.exclude(age=20,name='zhuyu')
# 查詢出不是name為朱宇,并且年齡為20的所有學生,相當于and
6、count 查看queryset對象里的個數
ret = models.Student.object.all()
# ret為一個整型
7、order_by 排序
# 以學生年齡從小到大排序
ret = models.Student.object.order_by('age')
# ret為queryset對象
# 以學生年齡從大到小排序
ret = models.Student.object.order_by('-age')
# 我認為實現方法為,先取出一個條件(也就是字符串),取索引0,看是否為'-',是的話
# 取索引1到最后為條件,再轉換sql語句時,ASC改為DESC,排序方式改變。
8、reverse 結果取反
ret = models.Student.object.order_by('age').reverse()
# ret為queryset對象,年齡從大到小排序。
9、exists 判斷queryset對象里是否有數據嘛
它的返回值就是True False
10、values和values_list
values:它是queryset對象的方法,它的返回值也是queryset對象,里面是一個大列表裝著一個一個字典
字典里的key就是values里的值
values_list:queryset對象的方法,它的返回值也是queryset對象,里面是一個大列表一個一個元組,元組的值就是values_list里所取到的值。
11、distinct 去重,不用多說了,queryset對象的方法。
12、get 也是取出符合條件的一個,但是那個條件必須是唯一的,必須存在的。
假如:取出叫zhuyu的學生,叫zhuyu的學生不止一個,那么你用get就會報錯取出叫dsb的學生,如果沒有,你用get就會出錯。
上面就是一些單表查詢的方法,發現沒有,為何每個返回值,我都要寫什么類型,大多數就是queryset類型,所以只要前面
是queryset對象,我們都可以用到它的方法,比如:取出學生balance為5000,且按照年齡從小到大排序。
下面寫寫基于雙下劃線的模糊查詢
# 查詢學生年齡為12,16,13的學生 models.Student.object.filter(age__in=[13,13,16]) # 查詢學生年齡大于12的學生 models.Student.object.filter(age__gt=12) # 查詢學生年齡小于12的學生 models.Student.object.filter(age__lt=12) # 查詢學生年齡大于等于12的學生 models.Student.object.filter(age__gte=12) # 查詢學生年齡小于等于12的學生 models.Student.object.filter(age__lte=12) # 查詢學生名字中有宇的學生 models.Student.object.filter(name__contains='宇') # 查詢學生名字以朱開頭的學生 models.Student.object.filter(name__startswith='朱')
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。