數(shù)據(jù)庫基本操作(查詢)
一规辱、查詢對象
從數(shù)據(jù)庫里檢索對象谆棺,可以通過模型的Manage來建立QuerySet,一個QuerySet表現(xiàn)為一個數(shù)據(jù)庫中對象的結(jié)合,他可以有0個一個或多個過濾條件,在SQL里QuerySet相當(dāng)于select語句用where或limit過濾改淑。你通過模型的Manage來獲取QuerySet碍岔,每個模型至少有一個Manage
注:
Managers
只可以通過模型的類訪問,而不可以通過模型的實例訪問朵夏,目的是為了強制區(qū)分“表級別”的操作和“記錄級別”的操作
二蔼啦、返回QuerySet對象
要檢索數(shù)據(jù)庫中的對象,就要為你的model 類構(gòu)造一個查詢集QuerySet仰猖。一個QuerySet就代表數(shù)據(jù)庫中的一組數(shù)據(jù)捏肢。它可以有一個或很多個,也可以通過filter根據(jù)給定的參數(shù)對數(shù)據(jù)集做進一步篩選饥侵。在SQL術(shù)語中鸵赫,QuerySet相當(dāng)于SELECT語句,filter相當(dāng)于WHERE或LIMIT這樣的限定從句
為什么要使用QuerySet對象,主要是他包含兩個比較重要的特性
- 惰性機制
- 緩存機制
query_set緩存機制1次數(shù)據(jù)庫查詢結(jié)果query_set都會對應(yīng)一塊緩存躏升,再次使用該query_set時辩棒,不會發(fā)生新的SQL操作;這樣減小了頻繁操作數(shù)據(jù)庫給數(shù)據(jù)庫帶來的壓力
1膨疏、all
-
方法
all()[]
-
說明
查詢所有信息 支持切片操作,切片只支持正整數(shù),索引從0開始
-
示例代碼
# 不觸發(fā)數(shù)據(jù)庫操作 users = UserInfo.objects.all() for user in users: # 觸發(fā)數(shù)據(jù)庫操作 print(user.username) # 切片操作 觸發(fā)數(shù)據(jù)庫操作 # 獲取第11條數(shù)據(jù) users = UserInfo.objects.all()[10] # 獲取前5條數(shù)據(jù) users = UserInfo.objects.all()[0:5] # 獲取第1條到第10條數(shù)據(jù) users = UserInfo.objects.all()[1:10] users = UserInfo.objects.all()[0:10:2]
2一睁、filter
-
方法
filter(**kwargs)
-
說明
返回一個QuerySet,包含滿足查詢參數(shù)的對象
-
參數(shù)
-
**kwargs
查詢的參數(shù),where后面的條件
-
-
示例代碼
UserInfo.objects.filter(username='小明')
3成肘、exclude()
-
方法
exclude(**kwargs)
-
說明
反向查詢卖局,指返回查詢條件相反的對象
-
參數(shù)
-
**kwargs
查詢的參數(shù),where后面的條件
-
-
示例代碼
UserInfo.objects.exclude(username='小明')
4、order_by()
-
方法
order_by(**kwargs)
-
說明
對結(jié)果集進行升序或降序双霍,可指定需要排序的字段砚偶。
-
參數(shù)f
-
**kwargs
查詢的參數(shù),order by后面的字段
-
-
示例代碼
# 升序 UserInfo.objects.filter().order_by('create_date') # 降序 UserInfo.objects.filter().order_by('-create_date') # 隨機排序(開發(fā)中不要使用) UserInfo.objects.order_by('?create_date')
5、values()
-
方法
values(**kwargs,**expressions)
-
說明
- 當(dāng)作為迭代器使用時洒闸,返回一個返回字典染坯,而不是模型實例。
- 該values()方法采用可選的位置參數(shù)丘逸,*fields它指定SELECT應(yīng)限制的字段名稱单鹿。如果指定了字段,每個字典將僅包含指定字段的字段鍵/值深纲。如果不指定字段仲锄,則每個字典將包含數(shù)據(jù)庫表中每個字段的鍵和值
- 該values()方法還包含可選的關(guān)鍵字參數(shù) **expressions
-
參數(shù)
-
**kwargs
過濾的列
-
**expressions
關(guān)鍵字參數(shù) 例如常見的:Lower(值轉(zhuǎn)化成小寫), Upper(值轉(zhuǎn)化成大寫), Length(計算值的長度)
-
-
示例代碼
UserInfo.objects.all().values() #指定字典 UserInfo.objects.all().values('username') # 可選關(guān)鍵字 from django.db.models.functions import Lower, Upper, Length objects.values(lower=Lower('username')) objects.values(lower=Upper('username')) objects.values(lower=length('username'))
6、values_list()
-
方法
values_list(*fields,flat=False)
-
說明
返回列表湃鹊,每個元組都包含傳入values_list()調(diào)用的相應(yīng)字段或表達式的值儒喊,
-
參數(shù)
-
*fields
過濾在的字段
-
flat
bool類型,默認是False,
如果只傳入單個字段,則還可以傳入 flat 參數(shù)設(shè)置為True币呵,這將意味著返回的結(jié)果是單值怀愧,而不是一元組。
-
-
示例代碼
# 查詢所有字段的值 users = UserInfo.objects.all().values_list() # 查詢單值字段的值 users = UserInfo.objects.values_list('username', flat=True) # 查詢指定字段的值 users = UserInfo.objects.values_list('uid', 'username') # 如果想查詢單條記錄可以 users = UserInfo.objects.values_list('uid', 'username').first() # 或者 users = UserInfo.objects.values_list('uid', 'username').get(pk=1)
7、raw()
-
方法
raw(str)
-
說明
在模型查詢API不夠用的情況下芯义,你可以使用原始的SQL語句哈垢。Django提供兩種方法使用原始SQL進行查詢:一種是使用Manager.raw()方法,進行原始查詢并返回模型實例扛拨;另一種是完全避開模型層耘分,直接執(zhí)行自定義的SQL語句。
raw()接受一個原始的SQL查詢鬼癣,執(zhí)行它并返回一個 django.db.models.query.RawQuerySet實例陶贼。這個RawQuerySet實例可以像正常一樣迭代QuerySet以提供對象實例。
-
參數(shù)說明
-
str
原生sql語句
-
-
示例代碼
raw = UserInfo.objects.raw( 'select * from UserInfo where username = '%s' ORDER BY id desc' % name) #通過raw方法查詢的結(jié)果是一個RawQuerySet對象待秃,如果想取到所有的值 raw[0].__dict__ #可以封裝成方法 def Serialization(objects) : ''' _obj: objext -> list, Python 3.6新加入的特性, 用來標(biāo)識這個方法接收一個對象并返回一個list orm.raw序列化 ''' _list = [] _get = [] for i in objects: _list.append(i.__dict__) for i in _list: del i['_state'] _get.append(i) return _get
8、鏈式查詢
-
說明
類似jQuery的鏈式編程
-
示例代碼
users = UserInfo.objects.filter(username='test2').exclude(is_delete=True).filter(create_date=date(2018, 7, 5)) # 等同 # qt = UserInfo.objects.filter(username='test2') # qt = qt.exclude(is_delete=True) # qt = qt.filter(create_date=date(2018, 7, 5))
11痹屹、Q()
-
說明
Q對象(django.db.models.Q)可以對關(guān)鍵字參數(shù)進行封裝章郁,從而更好地應(yīng)用多個查詢≈狙埽可以組合使用 &(and),|(or)暖庄,~(not)操作符,當(dāng)一個操作符是用于兩個Q的對象,它產(chǎn)生一個新的Q對象
每個接受關(guān)鍵字參數(shù)的查詢函數(shù)(例如
filter()
楼肪、exclude()
培廓、get()
)都可以傳遞一個或多個Q
對象作為位置(不帶名的)參數(shù)。如果一個查詢函數(shù)有多個Q
對象參數(shù)春叫,這些參數(shù)的邏輯關(guān)系為“AND"注意:一定要把Q對象放在關(guān)鍵字參數(shù)查詢的前面
-
示例代碼
# 查詢 注冊日期是2016-10-2 或者 2016-10-6日的所有用戶信息 users= UserInfo.objects.filter( Q(create_time=date(2016, 10, 2)) | Q(create_time=date(2016, 10, 6)) ) # 查詢 用戶名是xiaohong 和 沒有注銷的用戶信息 users= UserInfo.objects.filter( Q(username='xiaohong') & Q(is_delete=False) )
12肩钠、F()
-
說明
允許Django在未實際鏈接數(shù)據(jù)的情況下具有對數(shù)據(jù)庫字段的值的引用。通常情況下我們在更新數(shù)據(jù)時需要先從數(shù)據(jù)庫里將原數(shù)據(jù)取出后方在內(nèi)存里暂殖,然后編輯某些屬性价匠,最后提交。F對象支持四則運算
-
示例代碼
# from django.db.models import F UserInfo.objects.update(num=F('num')+1)
三呛每、不返回QuerySet對象
QuerySet方法結(jié)果集不返回QuerySet踩窖。這些方法不使用緩存。相反晨横,他們每次查詢都會調(diào)用數(shù)據(jù)庫洋腮。
1、get()
-
方法
get(**kwargs)
-
說明
返回匹配給定查找參數(shù)的對象手形,該參數(shù)應(yīng)采用字段查找中描述的格式
如果沒有找到給定參數(shù)的對象啥供,則引發(fā)DoesNotExist異常。
如果沒有找多個給定參數(shù)的對象叁幢,則引發(fā)MultipleObjectsReturned異常滤灯。
-
參數(shù)說明
**kwargs: 查詢的參數(shù)
-
返回值
模型對象
-
示例代碼
user = UserInfo.objects.get(uid=1) UserInfo.objects.get(id=1, username='xiaoming')
3、count()
-
方法
count()
-
說明
返回總條數(shù)
-
參數(shù)說明
無
-
返回值
整形
-
示例代碼
UserInfo.objects.count() UserInfo.objects.filter(uid gt =1).count()
4、last()
-
說明
獲取最后最后一條數(shù)據(jù)
5鳞骤、first()
-
說明
獲取第一條數(shù)據(jù)
6窒百、annotate()
-
方法
annotate(*args,**kwargs)
-
說明
分組函數(shù),用于實現(xiàn)聚合group by查詢 前面的values寫的是誰,就group誰
參數(shù)說明
-
返回值
通過計算得到的聚合值的字典
-
示例代碼
from django.db.models import Avg, Min, Max, Count, Sum # 按性別統(tǒng)計用戶的總數(shù) # SELECT `sex`, COUNT('count') AS `uid` FROM `user` GROUP BY `sex`, users = UserInfo.objects.values('sex').annotate(uid=Count('uid')) # SELECT `user`.`sex`, COUNT(`user`.`uid`) AS `uid`, AVG(`user`.`age`) AS `ages` FROM `user` GROUP BY `user`.`sex`, users = UserInfo.objects.values('sex').annotate(uid=Count('uid'), ages=Avg('age'))
7豫尽、aggregate()
-
方法
aggregate(*args, **kwargs)
-
說明
聚合函數(shù)
-
參數(shù)說明
- Avg,
- Min,
- Max,
- Count,
- Sum
-
返回值
通過計算得到的聚合值的字典
-
示例代碼
from django.db.models import Avg, Min, Max, Count, Sum users = UserInfo.objects.aggregate(uid=Count('uid'))