【Django使用】md文檔10大模塊第5期:Django數據庫增刪改查和Django視圖

Django的主要目的是簡便、快速的開發數據庫驅動的網站。它強調代碼復用,多個組件可以很方便的以"插件"形式服務于整個框架,Django有許多功能強大的第三方插件,你甚至可以很方便的開發出自己的工具包。這使得Django具有很強的可擴展性。它還強調快速開發和DRY(DoNotRepeatYourself)原則

Django全套筆記直接地址: 請移步這里


共 4 章,47 子模塊


數據庫操作-查詢

查詢集QuerySet

1 概念

Django的ORM中存在查詢集的概念。

查詢集,也稱查詢結果集、QuerySet,表示從數據庫中的對象集合。

當調用如下過濾器方法時,Django會返回查詢集(而不是簡單的列表):

  • all():返回所有數據。
  • filter():返回滿足條件的數據。
  • exclude():返回滿足條件之外的數據。
  • order_by():對結果進行排序。

對查詢集可以再次調用過濾器進行過濾,如

>>> books = BookInfo.objects.filter(readcount__gt=30).order_by('pub_date')
>>> books
<QuerySet [<BookInfo: 天龍八部>, <BookInfo: 雪山飛狐>]>

也就意味著查詢集可以含有零個、一個或多個過濾器。過濾器基于所給的參數限制查詢的結果。

從SQL的角度講,查詢集與select語句等價,過濾器像where、limit、order by子句。

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

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

2 兩大特性

1)惰性執行

創建查詢集不會訪問數據庫,直到調用數據時,才會訪問數據庫,調用數據的情況包括迭代、序列化、與if合用

例如,當執行如下語句時,并未進行數據庫查詢,只是創建了一個查詢集books

books = BookInfo.objects.all()

繼續執行遍歷迭代操作后,才真正的進行了數據庫的查詢

for book in books:print(book.name)
2)緩存

使用同一個查詢集,第一次使用時會發生數據庫的查詢,然后Django會把結果緩存下來,再次使用這個查詢集時會使用緩存的數據,減少了數據庫的查詢次數。

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

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

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

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

3 限制查詢集

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

注意:不支持負數索引。

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

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

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

>>> books = BookInfo.objects.all()[0:2]
>>> books
<QuerySet [<BookInfo: 射雕英雄傳>, <BookInfo: 天龍八部>]>

4.分頁

文檔

  #查詢數據books = BookInfo.objects.all()#導入分頁類from django.core.paginator import Paginator#創建分頁實例paginator=Paginator(books,2)#指定頁碼的數據page_skus = paginator.page(1)#分頁數據total_page=paginator.num_pages

視圖

重點

  • HttpRequest

    • 位置參數和關鍵字參數
    • 查詢字符串
    • 請求體:表單數據,JSON數據
    • 請求頭
  • HttpResponse

    • HttpResponse

    • JsonResponse

    • redirect

  • 類視圖

    • 類視圖的定義和使用

    • 類視圖裝飾器(難點)

視圖介紹和項目準備

視圖介紹
  • 視圖就是應用views.py文件中的函數

  • 視圖的第一個參數必須為HttpRequest對象,還可能包含下參數如

    • 通過正則表達式組的位置參數
    • 通過正則表達式組獲得的關鍵字參數
  • 視圖必須返回一個HttpResponse對象子對象作為響應

    • 子對象: JsonResponse HttpResponseRedirect
  • 視圖負責接受Web請求HttpRequest,進行邏輯處理,返回Web響應HttpResponse給請求者

    • 響應內容可以是HTML內容404錯誤重定向json數據
  • 視圖處理過程如下圖:

使用視圖時需要進行兩步操作,兩步操作不分先后

  1. 配置URLconf
  2. 應用/views.py中定義視圖
項目準備
  • 創建項目+創建應用+安裝應用+配置模板路徑+本地化+mysql數據庫+URLconf+視圖

  • mysql數據庫使用之前的book

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','HOST': '127.0.0.1', # 數據庫主機'PORT': 3306, # 數據庫端口'USER': 'root', # 數據庫用戶名'PASSWORD': 'mysql', # 數據庫用戶密碼'NAME': 'book' # 數據庫名字}
}
  • URLconf

    • settings.py中:指定url配置
    ROOT_URLCONF = 'bookmanager.urls'
    
    • 項目中urls.py:只要不是admin/就匹配成功,包含到應用中的urls.py

from django.conf.urls import url,include
from django.contrib import admin

urlpatterns = [
url(r’^admin/', include(admin.site.urls)),

    # 只要不是‘admin/’就匹配成功,包含到應用中的urls.pyurl(r'^', include('book.urls')),
]
* 應用中`urls.py`:匹配`testproject/`成功就調用`views`中的`testproject`函數,測試項目邏輯```python
from django.conf.urls import url
import viewsurlpatterns = [# 匹配`testproject/`成功就調用`views`中的`testproject`函數url(r'^testproject/$', views.testproject),
]
  • 視圖:測試項目邏輯
from django.http import HttpResponse# 測試項目邏輯def testproject(request):return HttpResponse('測試項目邏輯')
  • 在models.py 文件中定義模型類
from django.db import models# Create your models here.# 準備書籍列表信息的模型類class BookInfo(models.Model):# 創建字段,字段類型...name = models.CharField(max_length=20, verbose_name='名稱')pub_date = models.DateField(verbose_name='發布日期',null=True)readcount = models.IntegerField(default=0, verbose_name='閱讀量')commentcount = models.IntegerField(default=0, verbose_name='評論量')is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除')class Meta:db_table = 'bookinfo'  # 指明數據庫表名verbose_name = '圖書'  # 在admin站點中顯示的名稱def __str__(self):"""定義每個數據對象的顯示信息"""return self.name# 準備人物列表信息的模型類class PeopleInfo(models.Model):GENDER_CHOICES = ((0, 'male'),(1, 'female'))name = models.CharField(max_length=20, verbose_name='名稱')gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性別')description = models.CharField(max_length=200, null=True, verbose_name='描述信息')book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='圖書')  # 外鍵is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除')class Meta:db_table = 'peopleinfo'verbose_name = '人物信息'def __str__(self):return self.name

1**)生成遷移文件**

python manage.py makemigrations

2)同步到數據庫中

python manage.py migrate

3**)添加測試數據**

insert into bookinfo(name, pub_date, readcount,commentcount, is_delete) values
('射雕英雄傳', '1980-5-1', 12, 34, 0),
('天龍八部', '1986-7-24', 36, 40, 0),
('笑傲江湖', '1995-12-24', 20, 80, 0),
('雪山飛狐', '1987-11-11', 58, 24, 0);
insert into peopleinfo(name, gender, book_id, description, is_delete)  values('郭靖', 1, 1, '降龍十八掌', 0),('黃蓉', 0, 1, '打狗棍法', 0),('黃藥師', 1, 1, '彈指神通', 0),('歐陽鋒', 1, 1, '蛤蟆功', 0),('梅超風', 0, 1, '九陰白骨爪', 0),('喬峰', 1, 2, '降龍十八掌', 0),('段譽', 1, 2, '六脈神劍', 0),('虛竹', 1, 2, '天山六陽掌', 0),('王語嫣', 0, 2, '神仙姐姐', 0),('令狐沖', 1, 3, '獨孤九劍', 0),('任盈盈', 0, 3, '彈琴', 0),('岳不群', 1, 3, '華山劍法', 0),('東方不敗', 0, 3, '葵花寶典', 0),('胡斐', 1, 4, '胡家刀法', 0),('苗若蘭', 0, 4, '黃衣', 0),('程靈素', 0, 4, '醫術', 0),('袁紫衣', 0, 4, '六合拳', 0);

URLconf

  • 瀏覽者通過在瀏覽器的地址欄中輸入網址請求網站
  • 對于Django開發的網站,由哪一個視圖進行處理請求,是由url匹配找到的

配置URLconf

  • 1.settings.py

    • 指定url配置
    ROOT_URLCONF = '項目.urls'
    
  • 2.項目中urls.py

    • 匹配成功后,包含到應用的urls.py
    url(正則, include('應用.urls'))
    
  • 3.應用中urls.py

    • 匹配成功后,調用views.py對應的函數
    url(正則, views.函數名)
    
  • 4.提示

1. 正則部分推薦使用 r,表示字符串不轉義,這樣在正則表達式中使用 \ 只寫一個就可以2. 不能在開始加反斜杠,推薦在結束加反斜杠正確:path/正確:path錯誤:/path錯誤:/path/3. 請求的url被看做是一個普通的python字符串,進行匹配時不包括域名、get或post參數3.1 如請求地址如下:http://127.0.0.1:8000/18/?a=103.2 去掉域名和參數部分后,只剩下如下部分與正則匹配18/

說明:

雖然路由結尾帶/能帶來上述好處,但是卻違背了HTTP中URL表示資源位置路徑的設計理念。

是否結尾帶/以所屬公司定義風格為準。

路由命名與reverse反解析(逆向)

1 路由命名

在定義路由的時候,可以為路由命名,方便查找特定視圖的具體路徑信息。

  1. 在使用include函數定義路由時,可以使用namespace參數定義路由的命名空間,如
url(r'^',include('book.urls',namespace='book'))

命名空間表示,凡是book.urls中定義的路由,均屬于namespace指明的book名下。

命名空間的作用:避免不同應用中的路由使用了相同的名字發生沖突,使用命名空間區別開。

  1. 在定義普通路由時,可以使用name參數指明路由的名字,如
urlpatterns = [url(r'^$',index),# 匹配書籍列表信息的URL,調用對應的bookList視圖url(r'^booklist/$',bookList,name='index'),url(r'^testproject/$',views.testproject,name='test'),
]

2 reverse反解析

使用reverse函數,可以根據路由名稱,返回具體的路徑,如:

from django.core.urlresolvers import reverse#或者from django.urls import reversedef testproject(request):return HttpResponse("OK")# 定義視圖:提供書籍列表信息def bookList(request):url = reverse('book:test')print(url)return HttpResponse('index')
  • 對于未指明namespace的,reverse(路由name)
  • 對于指明namespace的,reverse(命名空間namespace:路由name)

使用 PostMan 對請求進行測試

PostMan 是一款功能強大的網頁調試與發送網頁 HTTP 請求的 Chrome 插件,可以直接去對我們寫出來的路由和視圖函數進行調試,作為后端程序員是必須要知道的一個工具。

  • 安裝方式1:去 Chrome 商店直接搜索 PostMan 擴展程序進行安裝

  • 安裝方式2:https://www.getpostman.com/官網下載桌面版

  • 安裝方式3:將已下載好的 PostMan 插件文件夾拖入到瀏覽器

    • 打開 Chrome 的擴展程序頁面,打開開發者模式選項

    • 將插件文件夾拖入到瀏覽器(或者點擊加載已解壓的擴展程序選擇文件夾)

      • 在 Mac 下生成桌面圖標,可以點擊啟動
      • 在 ubuntu 舊版的 Chrome 瀏覽器中會顯示以下效果,可以直接點擊啟動
  • 使用 PostMan,打開之后,會彈出注冊頁面,選擇下方的Skip this,go straight to the app進行程序

未完待續 下一期下一章

全套筆記直接地址: 請移步這里

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/160251.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160251.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160251.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue項目 配置項設置

一、項目運行時瀏覽器自動打開 找到package.json文件 找到"sctipts"配置項 在"serve"配置項最后加上--open "scripts": {"serve": "vue-cli-service serve --open","build": "vue-cli-service build&quo…

Redis面試內容,Redis過期策略,Redis持久化方式,緩存穿透、緩存擊穿和緩存雪崩,以及解決辦法

文章目錄 一、redis什么是RedisRedis使用場景1、緩存2、數據共享[分布式](https://so.csdn.net/so/search?q分布式&spm1001.2101.3001.7020)3、分布式鎖4、全局ID5、計數器6、限流7、位統計 Redis有5中數據類型&#xff1a; SSHLZRedis中一個key的值每天12點過期&#xff…

Cookie、Session、CBV加裝飾器的三種方法

【0】cookie、session和Token的發展史 【1】Cookie的形式 存儲形式&#xff1a;k&#xff1a;v鍵值對存儲位置&#xff1a;客戶端缺點&#xff1a;不安全&#xff0c;信息可能會泄露 【2】session的形式 標識符&#xff0c;表示我是當前用戶加密出來的數據對敏感信息進行加密…

排序算法-----快速排序(非遞歸實現)

目錄 前言 快速排序 基本思路 非遞歸代碼實現 前言 很久沒跟新數據結構與算法這一欄了&#xff0c;因為數據結構與算法基本上都發布完了&#xff0c;哈哈&#xff0c;那今天我就把前面排序算法那一塊的快速排序完善一下&#xff0c;前面只發布了快速排序遞歸算法&#xff0c;…

單鏈表相關面試題--3.鏈表的中間節點

3.鏈表的中間節點 876. 鏈表的中間結點 - 力扣&#xff08;LeetCode&#xff09; /* 解題思路&#xff1a; 通過快慢指針找到中間節點&#xff0c;快指針每次走兩步&#xff0c;慢指針每次走一步&#xff0c;當快指針走到結尾的時候&#xff0c;慢指針正好走到中間位置 */ typ…

HTTPS協議的加密流程

目錄 一&#xff0c;HTTPS是什么 二&#xff0c;兩種加密方式 三&#xff0c;HTTPS的加密過程 3.1 引入對稱加密 3.2 引入非對稱加密 3.3 引入證書 一&#xff0c;HTTPS是什么 HTTPS也是一個應用層協議&#xff0c;它是在HTTP協議的基礎上引入了一個加密層。因為HTTP協議…

每天一道算法題(十)——獲取和為k的子數組

文章目錄 1、問題2、示例3、解決方法&#xff08;1&#xff09;方法1——雙指針 總結 1、問題 給你一個整數數組 nums 和一個整數 k &#xff0c;請你統計并返回 該數組中和為 k 的子數組的個數 。 子數組是數組中元素的連續非空序列。 2、示例 示例 1&#xff1a; 輸入&#x…

多分類自定義采樣比例

多分類自定義采樣比例 import torch from torch.utils.data import DataLoader, Dataset, WeightedRandomSampler from torchvision import transforms from torchvision.datasets import ImageFolder# 假設你有一個自定義的數據集類 class CustomDataset(Dataset):def __init…

51單片機按鍵控制LED燈亮滅的N個玩法

51單片機按鍵控制LED燈亮滅的N個玩法 1.概述 這篇文章介紹按鍵的使用&#xff0c;以及通過控制LED燈的小實驗&#xff0c;發現按鍵中存在的問題&#xff0c;然后思考并解決這些問題。達到熟練使用按鍵控制元器件。 2.搭建硬件環境 1.硬件準備 名稱型號數量單片機STC12C205…

2023全球數字貿易創新大賽9-12

目錄 回答評委提問:先說痛點-再說怎樣解決 食品安全溯源是否全流程 星火? 鏈網

Sleuth

Sleuth 一 引言 隨著服務的越來越多&#xff0c;對調?鏈的分析會越來越復雜。它們之間的調?關系也許如下圖&#xff1a; 問題&#xff1a; 1&#xff1a;微服務之間的調?錯綜復雜&#xff0c;?戶發送的請求經歷那些服務&#xff0c;調?鏈不清楚&#xff0c;沒有? 個?…

【SpringCloud微服務全家桶學習筆記-Hystrix(服務降級,熔斷,接近實時的監控,服務限流等)】

服務雪崩 &#xff08;微服務面臨的問題&#xff09; 多個微服務之間調用的時候&#xff0c;假設微服務A調用微服務B和微服務C&#xff0c;微服務B和微服務C又調用其它的微服務&#xff0c;這就是所謂的“扇出”。如果扇出的鏈路上某個微服務的調用響應時間過長或者不可用&…

HarmonyOS開發(五):常用基礎組件

1、組件介紹 組件&#xff08;Component&#xff09;,是界面搭建及顯示的最小單元。 組件根據功能可以分為五大類&#xff1a;基礎組件、容器組件、媒體組件、繪制組件、畫布組件 2、基礎組件 基礎組件是視圖層的基本組成單元&#xff0c;它包含&#xff1a;Text、Image、T…

OpenCV C++ 張正友相機標定【相機標定原理、相機標定流程、圖像畸變矯正】

文章目錄 3.1 標定原理3.2 相機標定流程步驟1:采集棋盤格圖像,批處理(調整尺寸、重命名)步驟2:提取棋盤格內角點坐標步驟3:進一步提取亞像素角點信息在棋盤標定圖上繪制找到的內角點(非必須,僅為了顯示)步驟4:相機標定--計算出相機內參數矩陣和畸變系數步驟5:畸變圖像…

Spring (二)@Order, Ordered 失效

Spring &#xff08;二&#xff09;Order, Ordered 失效 先上例子 public class OrderAnnotationExample {Order(2)static class MyBeanFactoryPostProcessor1 implements BeanFactoryPostProcessor {Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFa…

如何加速JavaScript 代碼運行速度

如何加速JavaScript 代碼運行速度 前言減少DOM訪問避免不必要的變量延遲script加載異步和同步使用異步編程避免使用With關鍵詞 前言 本文主要通過五個方面來講解如何使Js代碼得到性能優化&#xff0c;從而實現加快Js代碼運行速度的作用。那么好&#xff0c;本文正式開始。 減…

感染了后綴為.[bkpsvr@firemail.cc].EKING勒索病毒如何應對?數據能夠恢復嗎?

導言&#xff1a; 在當前數字時代&#xff0c;勒索病毒成為網絡威脅的一大隱患。本文將深入介紹一種名為[bkpsvrfiremail.cc].EKING的勒索病毒&#xff0c;以及如何應對遭受其攻擊后&#xff0c;有效地恢復被加密的數據文件&#xff0c;并提供一些預防措施以減少感染的風險。數…

sqlserver==索引解析,執行計劃,索引大小

1創建測試表 -- 創建大型表 CREATE TABLE LargeTableWithIndex (ID int IDENTITY(1,1) PRIMARY KEY,IndexedColumn int,NonIndexedColumn nvarchar(255),OtherData nvarchar(255) );2插入測試數據 -- 使用 T-SQL 插入大量數據 DECLARE @i int = 1; WHILE @i <= 100000 -- …

Mac中LaTex無法編譯的問題

最近在使用TexStudio時&#xff0c;遇到一個棘手的問題&#xff1a; 無法編譯&#xff0c;提示如下&#xff1a; kpathsea: Running mktexfmt xelatex.fmt /Library/TeX/texbin/mktexfmt: kpsewhich -var-valueTEXMFROOT failed, aborting early. BEGIN failed–compilation a…