Django框架(六):模型(二) 欄位查詢、查詢集

来源:https://www.cnblogs.com/liuhui0308/archive/2020/01/19/12207595.html
-Advertisement-
Play Games

1. 欄位查詢 通過模型類.objects屬性可以調用如下函數,實現對模型類對應的數據表的查詢。 函數名 功能 返回值 說明 get 返回表中滿足條件的一條且只能有一條數據。 返回值是一個模型類對象。 參數中寫查詢條件。 1)如果查到多條數據,則拋異常MultipleObjectsReturned。 ...


1. 欄位查詢

通過模型類.objects屬性可以調用如下函數,實現對模型類對應的數據表的查詢。

函數名

功能

返回值

說明

get

返回表中滿足條件的一條且只能有一條數據。

返回值是一個模型類對象。

參數中寫查詢條件。

1)如果查到多條數據,則拋異常MultipleObjectsReturned。

2)查詢不到數據,則拋異常:DoesNotExist。

all

返回模型類對應表格中的所有數據。

返回值是QuerySet類型

查詢集

filter

返回滿足條件的數據。

返回值是QuerySet類型

參數寫查詢條件。

exclude

返回不滿足條件的數據。

返回值是QuerySet類型

參數寫查詢條件。

order_by

對查詢結果進行排序。

返回值是QuerySet類型

參數中寫根據哪些欄位進行排序。

get、all前面已經使用過了,下麵主要講解filter、exclude和order_by的使用。

準備數據:

index.html:

<html>
<head>
    <title>圖書列表</title>
</head>
<body>
<h1>{{title}}</h1>
{%for i in list%}
{{i.id}}<br>
{{i.btitle}}<br>
{{i.bpub_date}}<br>
{{i.bread}}<br>
{{i.bcomment}}<br>
{%endfor%}
</body>
</html>

我們後面的查詢只需要在views.py中修改代碼就行了。

1.1 查看mysql資料庫日誌

為了方便查看查詢結果,我們先配置下,讓系統生成mysql日誌文件。

我使用的是mysql5.7版本,其他版本可以參考這個,但是建議是自己去百度。

查看mysql資料庫日誌可以查看對資料庫的操作記錄需要做如下配置:

首先查看是否開啟了binlog:show binary logs;

發現沒有開啟logs,那麼我們就可以開始配置了。

我們要去C:\ProgramData\MySQL\MySQL Server 5.7路徑下找到my.ini文件。

然後編輯這個文件,我們可以使用搜索功能。

修改成這樣:

# Binary Logging.
log-bin=mysql-bin
binlog-format=Row

如果不能修改,就使用管理員許可權打開。

然後重啟mysql服務。

驗證binlog是否開啟:show variables like 'log_bin'; 和 show binary logs;

binlog文件的位置:如果在修改my.ini的binlog時給的是全路徑,那麼生成的日誌文件就在指定的目錄下;如果只給一個名字,那麼生成的binlog日誌的位置為: 

如果給的全路徑配置為:

log-bin=指定路徑\mysql-bin
binlog-format=Row

那麼就會在指定路徑下生成文件。

1.2 條件運算符 

1.2.1 查詢

exact:表示判斷等於,和 = 差不多。

例:查詢編號為1的圖書。

list=BookInfo.objects.filter(id__exact=1)

可簡寫為:

list=BookInfo.objects.filter(id=1)

1.2.2 模糊查詢

contains:是否包含。

如果要包含%無需轉義,直接寫即可。

list = BookInfo.objects.filter(btitle__contains='鬥')

startswith、endswith:以指定值開頭或結尾。

例:查詢書名以'天'結尾的圖書。

list = BookInfo.objects.filter(btitle__endswith='')

以上運算符都區分大小寫,在這些運算符前加上i表示不區分大小寫,如iexact、icontains、istartswith、iendswith。

1.2.3 空查詢

isnull:是否為null。

例:查詢書名不為空的圖書。

list = BookInfo.objects.filter(btitle__isnull=False)

1.2.4 範圍查詢

in:是否包含在範圍內。

例:查詢編號為1或3或5的圖書。

list = BookInfo.objects.filter(id__in=[1, 3, 5])

1.2.5 比較查詢

gt、gte、lt、lte:大於、大於等於、小於、小於等於。

例:查詢編號大於3的圖書。

list = BookInfo.objects.filter(id__gt=3)

不等於的運算符,使用exclude()過濾器。

例:查詢編號不等於3的圖書

list = BookInfo.objects.exclude(id=3)

1.2.6 日期查詢

year、month、day、week_day、hour、minute、second:對日期時間類型的屬性進行運算。

例:查詢2009年發表的圖書。

list = BookInfo.objects.filter(bpub_date__year=2009)

例:查詢2008年12月14日後發表的圖書。

from datetime import date
...
list = BookInfo.objects.filter(bpub_date__gt=date(2008, 12, 14))

1.3 F對象

之前的查詢都是對象的屬性與常量值比較,兩個屬性怎麼比較呢? 答:使用F對象,被定義在django.db.models中。

語法如下:

F(屬性名)

例:查詢閱讀量大於等於評論量的圖書。

from django.db.models import F
...
list = BookInfo.objects.filter(bread__gte=F('bcomment'))

可以在F對象上使用算數運算。

例:查詢閱讀量大於2倍評論量的圖書。

list = BookInfo.objects.filter(bread__gt=F('bcomment') * 2)

1.4 Q對象

多個過濾器逐個調用表示邏輯與關係,同sql語句中where部分的and關鍵字。

例:查詢閱讀量大於20,並且編號小於3的圖書。

list=BookInfo.objects.filter(bread__gt=20,id__lt=3)
或
list=BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)

如果需要實現邏輯或or的查詢,需要使用Q()對象結合|運算符,Q對象被義在django.db.models中。

語法如下:

Q(屬性名__運算符=值)

例:查詢閱讀量大於20的圖書,改寫為Q對象如下。

from django.db.models import Q
...
list = BookInfo.objects.filter(Q(bread__gt=20))

Q對象可以使用&、|連接,&表示邏輯與,|表示邏輯或。

例:查詢閱讀量大於20,或編號小於3的圖書,只能使用Q對象實現。

list = BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))

Q對象前可以使用~操作符,表示非not。

例:查詢編號不等於3的圖書。

list = BookInfo.objects.filter(~Q(pk=3))

1.5 聚合函數

使用aggregate()過濾器調用聚合函數。聚合函數包括:Avg,Count,Max,Min,Sum,被定義在django.db.models中。

例:查詢圖書的總閱讀量。

from django.db.models import Sum
...
sum = BookInfo.objects.aggregate(Sum('bread'))

修改界面

<html>
<head>
    <title>圖書列表</title>
</head>
<body>
<h1>{{title}}</h1>

{{sum}}<br>

</body>
</html>

以及

from django.shortcuts import render
from booktest.models import BookInfo
from django.db.models import Sum

def index(request):
    sum = BookInfo.objects.aggregate(Sum('bread'))

    context = {'title': '圖書列表', 'sum': sum}
    return render(request, 'booktest/index.html', context)

註意aggregate的返回值是一個字典類型,格式如下:

{'聚合類小寫__屬性名':值}
如:{'sum__bread':3}

使用count時一般不使用aggregate()過濾器。

例:查詢圖書總數。

count = BookInfo.objects.count()

參照上面修改代碼

註意count函數的返回值是一個數字。

2. 查詢集

查詢集表示從資料庫中獲取的對象集合,在管理器上調用某些過濾器方法會返回查詢集,查詢集可以含有零個、一個或多個過濾器。過濾器基於所給的參數限制查詢的結果,從Sql的角度,查詢集和select語句等價,過濾器像where和limit子句。

返回查詢集的過濾器如下:

  • all():返回所有數據。
  • filter():返回滿足條件的數據。
  • exclude():返回滿足條件之外的數據,相當於sql語句中where部分的not關鍵字。
  • order_by():對結果進行排序。

返回單個值的過濾器如下:

  • get():返回單個滿足條件的對象
    • 如果未找到會引發"模型類.DoesNotExist"異常。
    • 如果多條被返回,會引發"模型類.MultipleObjectsReturned"異常。
  • count():返回當前查詢結果的總條數。
  • aggregate():聚合,返回一個字典。

判斷某一個查詢集中是否有數據:

  • exists():判斷查詢集中是否有數據,如果有則返回True,沒有則返回False。

2.1 兩大特點

  • 惰性執行:創建查詢集不會訪問資料庫,直到調用數據時,才會訪問資料庫,調用數據的情況包括迭代、序列化、與if合用。
  • 緩存:使用同一個查詢集,第一次使用時會發生資料庫的查詢,然後把結果緩存下來,再次使用這個查詢集時會使用緩存的數據。

示例:查詢所有,編輯booktest/views.py的index視圖,運行查看。

list=BookInfo.objects.all()

2.2 查詢集的緩存

每個查詢集都包含一個緩存來最小化對資料庫的訪問。

在新建的查詢集中,緩存為空,首次對查詢集求值時,會發生資料庫查詢,django會將查詢的結果存在查詢集的緩存中,並返回請求的結果,接下來對查詢集求值將重用緩存中的結果。

演示:運行項目shell。

python manage.py shell

情況一:如下是兩個查詢集,無法重用緩存,每次查詢都會與資料庫進行一次交互,增加了資料庫的負載。

from booktest.models import BookInfo
[book.id for book in BookInfo.objects.all()]
[book.id for book in BookInfo.objects.all()]

情況二:經過存儲後,可以重用查詢集,第二次使用緩存中的數據。

list=BookInfo.objects.all()
[book.id for book in list]
[book.id for book in list]

2.3 限制查詢集

可以對查詢集進行取下標或切片操作,等同於sql中的limit和offset子句。

註意:不支持負數索引。

對查詢集進行切片後返回一個新的查詢集,不會立即執行查詢。

如果獲取一個對象,直接使用[0],等同於[0:1].get(),但是如果沒有數據,[0]引發IndexError異常,[0:1].get()如果沒有數據引發DoesNotExist異常。

示例:獲取第1、2項,運行查看。

list=BookInfo.objects.all()[0:2]


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

-Advertisement-
Play Games
更多相關文章
  • 一、java中八種基本數據類型對應的包裝類型 基本數據類型 包裝類型 byte java.lang.Byte short java.lang.Short int java.lang.Integer long java.lang.Long float java.lang.Float double ja ...
  • 開發環境: Windows操作系統 開發工具: Eclipse+Jdk+Tomcat+MYSQL資料庫 運行效果圖: 源碼及原文鏈接:http://javadao.xyz/forum.php?mod=viewthread&tid=28 ...
  • 慕課網-跳跳虎-圖解+仿寫 新手都能學懂的SpringBoot源碼課-366元 慕課網-跳跳虎-圖解+仿寫 新手都能學懂的SpringBoot源碼課-366元——全方位深入解析最新版SpringBoot源碼當下SpringBoot日漸取代SSM成為新項目首選框架,企業招聘對其要求也不斷提高。掌握Sp ...
  • 概述 ReentrantLock是一個可重入的互斥鎖,也被稱為獨占鎖。它支持公平鎖和非公平鎖兩種模式。 ReentrantLock的使用方法 下麵看一個最初級的例子: 在進入方法後,在需要加鎖的一些操作執行之前需要調用lock方法,在jdk文檔中對lock方法詳細解釋如下: 獲得鎖。 如果鎖沒有被另 ...
  • 相信有不少朋友日常工作會用到 Excel 處理各式表格文件,更有甚者可能要花大把時間來做繁瑣耗時的表格整理工作。最近有朋友問可否編程來減輕表格整理工作量,今兒我們就通過實例來實現 Python 對錶格的自動化整理。 首先我們有這麼一份數據表 source.csv: 我們要做的是從上表中提取數據,來生 ...
  • SpringMVC SpringMVC是一種輕量級的、基於MVC的Web層應用框架。 通過一套 MVC 註解,讓 POJO 成為處理請求的控制器,而無須實現任何介面。 採用了鬆散耦合可插拔組件結構,比其他 MVC 框架更具擴展性和靈活性。 優點: 1、天生與Spring框架集成,如:(IOC,AOP ...
  • 本文是針對我的工具 "藍奏雲批量下載工具" 的補充說明筆記,準備按照流程整理我實現軟體的思路與方法。 涉及知識 Java的IO流 Java的下載文件 HtmlUnit的使用方法 okhttp的使用 分析與軟體思路 在某一天,我找到了一部電子書的資源,但是,該藍奏雲地址是一個文件夾,由於藍奏雲不支持批 ...
  • Java 泛型通配符 ? extends super 的用法 示例 1 : ? extends ArrayList heroList 表示這是一個Hero泛型或者其子類泛型 heroList 的泛型可能是Hero heroList 的泛型可能是APHero heroList 的泛型可能是ADHero ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...