![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yMyUDN5UjZjBTYkdTMjFDZyYzX1ITNzMDM2EzLcdDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
本文目錄:
- 一、擷取全部記錄
- 1.1增加客戶
- 1.2擷取所有表記錄
- 1.3修改路由表
- 二、過濾條件
- 2.1 什麼是過濾條件
- 2.2過濾方法
- 2.3有限制的url
- `【系列好文推薦】`
一、擷取全部記錄
1.1增加客戶
現在我們來實作一個功能:浏覽器通路
sales/customers/
,我們的服務端就傳回系統中所有的客戶記錄給浏覽器。
首先我們增加兩個客戶:(這裡看不懂的話,可以去看第四節)
此時就直接在我們的資料庫管理中,出現了客戶資訊:
也可以直接通過資料庫裡面的添加功能,在資料庫裡面添加。
1.2擷取所有表記錄
我們先實作一個函數,來處理浏覽器發出的URL為
sales/customers/
的通路請求, 我們需要傳回 資料庫中
customer
表 所有記錄。’
Django 中 對資料庫表的操作, 應該都通過 Model對象 實作對資料的讀寫,而不是通過SQL語句。
比如,這裡我們要擷取 customer 表 所有記錄, 該表是和我們前面定義的 Customer 類管理的。
我們可以這樣擷取所有的表記錄。
在檔案sales/views.py 中,定義一個listcustomers 函數,内容如下:
# 導入 Customer 對象定義
from common.models import Customer
def listcustomers(request):
# 傳回一個 QuerySet 對象 ,包含所有的表記錄
# 每條表記錄都是是一個dict對象,
# key 是字段名,value 是 字段值
qs = Customer.objects.values()
# 定義傳回字元串
retStr = ''
for customer in qs:
for name,value in customer.items():
retStr += f'{name} : {value} | '
# <br> 表示換行
retStr += '<br>'
return HttpResponse(retStr)
Customer.objects.values() 就會傳回一個 QuerySet 對象,這個對象是Django 定義的,在這裡它包含所有的Customer 表記錄。
QuerySet 對象 可以使用 for 循環周遊取出裡面所有的元素。每個元素 對應 一條表記錄。
每條表記錄元素都是一個dict對象,其中 每個元素的 key 是表字段名,value 是 該記錄的字段值
上面的代碼就可以将 每條記錄的資訊存儲到字元串中 傳回給 前端浏覽器。
1.3修改路由表
我們還需要修改路由表, 加上對
sales/customers/ url
請求的 路由。
前面,我們在
bysms\urls.py
主路由檔案中,已經有如下的記錄了:
# 凡是 url 以 sales/ 開頭的,
# 都根據 sales.urls 裡面的 子路由表進行路由
path('sales/', include('sales.urls')),
這條URL記錄,指明 凡是 url 以 sales/ 開頭的,都根據 sales.urls 裡面的 子路由表進行路由。我們隻需修改 sales/urls.py 即可,添加如下記錄:
('customers/', views.listcustomers),
大家可以使用 admin 登入, 再添加一些 客戶記錄。
然後可以在浏覽器輸入如下 網址:
http://127.0.0.1:8080/sales/customers/
回車後,浏覽器顯示結果類似如下:
和我們資料庫中的記錄資訊一緻。
此時我們通過F12進行抓包處理:
會發現此時的
<br>
就是我們的換行指令。
二、過濾條件
2.1 什麼是過濾條件
有的時候,我們需要根據過濾條件查詢部分客戶資訊。
比如,當使用者在浏覽器輸入
/sales/customers/?phonenumber=13000000001
,要求傳回電話号碼為 13000000001 客戶記錄。
我們可以通過 filter 方法加入過濾條件,修改view裡面的代碼,如下所示:
def listcustomers(request):
# 傳回一個 QuerySet 對象 ,包含所有的表記錄
qs = Customer.objects.values()
# 檢查url中是否有參數phonenumber
ph = request.GET.get('phonenumber',None)
# 如果有,添加過濾條件
if ph:
qs = qs.filter(phonenumber=ph)
# 定義傳回字元串
retStr = ''
for customer in qs:
for name,value in customer.items():
retStr += f'{name} : {value} | '
# <br> 表示換行
retStr += '<br>'
return HttpResponse(retStr)
與剛才不同的是,我們加入了一段過濾條件:
# 檢查url中是否有參數phonenumber
ph = request.GET.get('phonenumber',None)
# 如果有,添加過濾條件
if ph:
qs = qs.filter(phonenumber=ph)
2.2過濾方法
看到函數定義的參數 request了:
Django 架構在 url 路由比對到函數後, 調用函數時,會傳入 一個 HttpRequest 對象給參數變量 request,該對象裡面 包含了請求的資料資訊。
HTTP 的 Get 請求url裡面的參數(術語叫 querystring 裡面的參數), 可以通過HttpRequest對象的 GET 屬性擷取。這是一個類似dict的對象。
比如要擷取querystring裡面的 phonenumber 參數 ,就可以像這樣:
ph = request.GET.get('phonenumber',None)
第二個參數傳入 None 表示,如果沒有 phonenumber 參數在 querystring中 ,就會傳回 None。
然後通過調用 QuerySet 對象的filter方法,就可以把查詢過濾條件加上去:
qs = qs.filter(phonenumber=ph)
有了這個過濾條件,Django 會在底層執行資料庫查詢的SQL語句 加上相應的 where 從句,進行過濾查詢。
注意,參數名 phonenumber 是和 定義的表 model 的屬性名 phonenumber 一緻的。
filter的過濾條件可以有多個,隻要繼續在後面的參數添加過濾條件即可。
比如:
qs = qs.filter(phonenumber=ph,address='山東日照')
這樣就 除了 根據電話号碼字段過濾,還有根據 位址字段過濾。
2.3有限制的url
現在在浏覽器輸入如下 url:
http://127.0.0.1:8080/sales/customers/?phonenumber=18300396393
通路結果如下: