Django運算表達式與Q對象/F對象sql
1 模型查詢數據庫
概述: 1 查詢集:表示從數據庫中獲取的對象的集合 2 查詢集能夠有多個過濾器,經過 邏輯運算符鏈接 3 過濾器就是一個函數,基於所給的參數限制查詢的結果,相似MySQL模糊查詢中where語句 4 查詢集等同select語句
2 查詢集django
特色: 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 比較運算符app
(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]