Django運算表達式與Q對象/F對象


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]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM