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

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]
相關文章
相關標籤/搜索