Django運算表達式與Q對象/F對象 1 模型查詢 概述: 1 查詢集:表示從資料庫中獲取的對象的集合 2 查詢集可以有多個過濾器,通過 邏輯運算符連接 3 過濾器就是一個函數,基於所給的參數限制查詢的結果,類似MySQL模糊查詢中where語句 4 查詢集等同select語句 2 查詢集 特點: ...
Django運算表達式與Q對象/F對象
1 模型查詢
概述:
1 查詢集:表示從資料庫中獲取的對象的集合
2 查詢集可以有多個過濾器,通過 邏輯運算符連接
3 過濾器就是一個函數,基於所給的參數限制查詢的結果,類似MySQL模糊查詢中where語句
4 查詢集等同select語句
2 查詢集
特點:
1 查詢集通過調用過濾器方進行查詢, 查詢集經過過濾器篩選後返回新的查詢集,可以鏈式調用
2 惰性執行 創建查詢集不會帶來任何資料庫的訪問直到調用資料庫才會訪問
返回單個數據查詢:
get() 返回一個滿足條件的對象
註意:沒有找到符合條件的對象,模型類引發異常 模型類.DoesNotExists異常
如果找到多個對象也會引發異常 模型類.MultipleObjectsReturned
count() 返回查詢集中的對象個數
first() 返回第一個查詢集對象
last() 返回最後一個查詢集對象
exists() 查詢集是否有數據,如果有數據返回true
限制查詢集:查詢集返回的是列表,可以採用下標的方法進行限制,等同於sql中的limit語句
studentList = Student.objects.all()[0:5]
查詢集緩存 : 每個查詢集都包含一個緩存,來最小化的對資料庫訪問。在新建的查詢集中,緩存首次為空,第一次對查詢 集求值,django會將數據緩存,並返回結果,以後結果直接使用緩存集的數據
3 常見過濾器
all() 返回所有對象
filter() filter(鍵=值,鍵=值) 且關係
返回符合條件的數據
filter(鍵=值),filter(鍵=值)
exclude() 過濾掉符合條件數據
order_by() 排序
values() 一條數據就是是一個對象(字典),返回一個列表
4 比較運算符
(1)概述: 實現where語句,作為filter() exclude() get()的參數
語法: 屬性名稱__運算符 = 值
外鍵: 屬性名_id
轉義: 類似like語句,是為了匹配占位,匹配數據中的%,sql中where like '\%'
filter(sname__contains = '%')
(2)常見的比較運算符:
exact 判斷,大小寫敏感
filter(isDelete=False)
contains 是否包含,大小寫敏感
stuList = Student.objects.filter(sname__contains ='孫' )
startswith 以value開頭,大小寫敏感
stuList = Student.objects.filter(sname__startswith ='孫' )
endwith 以value結尾,大小寫敏感
in 是否包含在範圍內 filter(pk__in=[2,4,6,8,10])
註: 以上四個前面加上i,就表示不區分大小寫,iexact,icontains,istartswith,iendswith
(3) 其他形式查詢
為空判斷:
isnull ,isnotnull 是否為空 filter(sname__isnull=Flase)
比較運算:
gt 大於
gte 大於等於
lt 小於
lte 小於等於
filter(sage_gt=30)年齡大於30
時間查詢:
year/month/day/week_day/hour/minute/second filter(lastTime__year=2017)
跨關查詢 處理join查詢 模型類型__屬性名__運算符(可選)
查詢快捷 pk 代表的主鍵
5 F對象與Q對象
常見的聚合函數:
使用aggregate()函數返回聚合函數的值
Avg Count Max Min sum
from dango.db.models import Max
maxAge = Student.objects.aggregate(Max('sage')) 找出學生年齡最大的
F對象
1 可以使用模型的A屬性與B屬性進行比較
from django.db.models import F,Q
def grades(request):
g = Grades.objects.filter(ggirlnum_gt=F('gboynum')) 找到女生人輸大於男生人數的班級
2 支持F對象的算術運算 filter(ggirlnum_gt=F('gboynum')+20)
3 F對象的參數可以是跨表欄位
models.Book.objects.filter(bread_num=F(''author_name'))
4 F對象參數如果是date/time,可以進行日期的加減運算:
models.Book.objects.filter(bpub_date__lt=F('bpub_date') + timedelta(days=5))
Q對象
概述 過濾器的方法中的關鍵字參數,,條件為And模式,採用邏輯或引入Q對象
需求 進行or查詢,或查詢
解決 使用Q對象
Q對象可以使用&(and)、|(or)操作符組合起來
studentList = Student.objects.filter(Q(pk__lt = 3)|Q(sage__gt=50)) pk_id小於3或年齡大於50歲
models.User.objects.filter(Q(username='老王') & Q(userpass='admin')) 條件與組合
models.User.objects.filter(~Q(username='老王')) 條件非表示取反
可以使用 &(and) |(or) ~(not) 結合括弧進行分組,構造更複雜的Q對象
filter函數可以傳遞一個或多個Q對象作為位置參數,如果有多個Q對象,這些參數的邏輯為and
下麵分享一個綜合用法:
def get(self, request, *args, **kwargs):
filters = request.GET
#找出符合customer的數據轉成列表
Qs = [Q(customer=request.user.customer)]
try:
if 'limit' in filters:
limit = abs(int(filters['limit']))
if limit > 50:
limit = 50
else:
limit = 15
start_id = int(filters.get('start_id', 0))
#添加符合start_id的對象
Qs.append(Q(id__gt=start_id))
#添加符合狀態的state
if 'state' in filters:
Qs.append(Q(state__in=filters['state']))
else:
Qs.append(Q(state__in=[0, 1, 2, 3, 4]))
#添加符合title的數據
if 'title' in filters:
Qs.append(Q(title__contains=filters['title']))
except Exception:
return params_error({"filters": "過濾參數不合法"})
#通過*Qs,對列表數據同時滿足上述情況的數據進行總的帥選,並設置限制集
sets = Questionnaire.objects.filter(*Qs)[:limit]