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

来源:https://www.cnblogs.com/why957/archive/2018/05/23/9075171.html
-Advertisement-
Play Games

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]

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼?這是要做前端的節奏嗎?只要公司有需要,我分分鐘變身、前端、美工、UI、交互、後端、資料庫管理員......快速學習、快速響應,快速適應。公司需要我幹啥,我就幹啥,而我存在於公司的意義就是利用所學的東西幫公司解決問題......事實上,如果讓一個人來搞定整個項目包括移動端、PC端等等,那你還不是 ...
  • 2018年5月4日,Angular6.0.0版正式發佈,新版本主要關註底層框架和工具鏈,目的在於使其變得更小更快。下麵就介紹下新版本的一些主要新特性,供大家參考。 ng update ng update 是新增的一個cli命令。通過ng update不僅可以保持正確的版本依賴,而且能保持依賴關係的同 ...
  • javascript和css文件中採用相對路徑,其基準路徑是完全不同的。 1.javascript引用資源(比如圖片)相對路徑是以宿主路徑(被引用的網頁比如你在首頁index.php引用了某js文件,則index.php即為宿主)所處位置為基準。 2.css引用資源(比如圖片)相對路徑是以.css文 ...
  • ...
  • 安裝 概念 在redux中分為3個對象:Action、Reducer、Store Action 1. 對行為(如用戶行為)的抽象 1. Action 就是一個普通 JavaScript 對象。如: (其中type欄位是約定也是必須的) 1. 作為Reducer的參數 Reducer 1. 一個普通的 ...
  • select下拉框選中的值,用jquery大家應該都會獲取, 如果select是多選的,也這麼獲取的話,則只能獲取到第一個選項的value值,但是有一個神奇的發現,如果是: 獲取text,則可以直接列印出選中的兩個選項的文本值的相連字元串,而不是只是第一個的text......... 獲取多選框的v ...
  • 1. vue-cli 簡介 Vue-cli 是 vue的設計者,為提升開發效率而提供的一個腳手架工具,可通過vue-cli快速構造項目結構 2. vue-cli 安裝步驟 安裝npm 或 cnpm 安裝webpack、webpack-cli 建議全局安裝一次: 建議全局安裝一次: 本地安裝一次: 本 ...
  • 下午學習了設計模式里的策略模式,寫個筆記,做個總結 策略模式的UML圖為: 舉個例子: 我們每個人都想走向人生巔峰,但是怎麼走向人生巔峰呢??有三個方法:1、當總經理;2、出任CEO;3、娶白富美。正好我身邊有三個小伙伴,他們就想通過這三種策略來走向人生巔峰。。。 首先是走向人生巔峰的策略介面 然後 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...