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數據
…
- 響應內容可以是
-
視圖處理過程如下圖:
使用視圖時需要進行兩步操作,兩步操作不分先后
- 配置
URLconf
- 在
應用/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 路由命名
在定義路由的時候,可以為路由命名,方便查找特定視圖的具體路徑信息。
- 在使用include函數定義路由時,可以使用namespace參數定義路由的命名空間,如
url(r'^',include('book.urls',namespace='book'))
命名空間表示,凡是book.urls中定義的路由,均屬于namespace指明的book名下。
命名空間的作用:避免不同應用中的路由使用了相同的名字發生沖突,使用命名空間區別開。
- 在定義普通路由時,可以使用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
進行程序