天天看點

Python Web開發(五):讀取資料庫資料

Python Web開發(五):讀取資料庫資料

本文目錄:

  • ​​一、擷取全部記錄​​
  • ​​1.1增加客戶​​
  • ​​1.2擷取所有表記錄​​
  • ​​1.3修改路由表​​
  • ​​二、過濾條件​​
  • ​​2.1 什麼是過濾條件​​
  • ​​2.2過濾方法​​
  • ​​2.3有限制的url​​
  • ​​`【系列好文推薦】`​​

一、擷取全部記錄

1.1增加客戶

現在我們來實作一個功能:浏覽器通路 ​

​sales/customers/​

​ ,我們的服務端就傳回系統中所有的客戶記錄給浏覽器。

首先我們增加兩個客戶:(這裡看不懂的話,可以去看第四節)

Python Web開發(五):讀取資料庫資料

此時就直接在我們的資料庫管理中,出現了客戶資訊:

Python Web開發(五):讀取資料庫資料

也可以直接通過資料庫裡面的添加功能,在資料庫裡面添加。

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),      
Python Web開發(五):讀取資料庫資料

大家可以使用 admin 登入, 再添加一些 客戶記錄。

然後可以在浏覽器輸入如下 網址: ​

​http://127.0.0.1:8080/sales/customers/​

​ 回車後,浏覽器顯示結果類似如下:

Python Web開發(五):讀取資料庫資料

和我們資料庫中的記錄資訊一緻。

此時我們通過F12進行抓包處理:

Python Web開發(五):讀取資料庫資料

會發現此時的​

​<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      

通路結果如下:

Python Web開發(五):讀取資料庫資料