在 Odoo 的開發中,操作資料庫是實現業務邏輯的重要一環。Odoo 的 ORM 系統為開發者提供了簡單而強大的工具,允許開發者通過 Python API 來輕鬆地對資料進行操作,而無需直接編寫 SQL 查詢。本文將以 Odoo 的 Repair 模組為例,展示如何使用 GET 請求來取得維修訂單資料,並展示如何使用 Postman 來測試這些 API。
Odoo 的 Repair 模組用於管理產品維修訂單。它記錄了維修流程的各個階段,並儲存了與維修相關的所有詳細信息,如產品、客戶、維修狀態、維修成本等。這個模組的核心模型是 repair.order
,對應資料表 repair_order
,用於存儲所有的維修訂單記錄。
在 Odoo 中,ORM 提供了一個簡單的介面來查詢資料。以下是一個簡單的控制器範例,展示了如何使用 ORM 來取得所有的維修訂單資料,並將其通過 GET 請求返回。
建立控制器來處理 GET 請求:
首先,我們需要建立一個控制器來處理 GET 請求,該請求將返回所有維修訂單的資料。
from odoo import http
from odoo.http import request
import json
class RepairOrderController(http.Controller):
@http.route('/repair/orders', type='http', auth='public', methods=['GET'], csrf=False)
def get_repair_orders(self):
# 使用 sudo 繞過權限檢查,檢索所有維修訂單
repair_orders = request.env['repair.order'].sudo().search([])
# 構建 JSON 響應
order_list = []
for order in repair_orders:
order_list.append({
'id': order.id,
'name': order.name,
'product': order.product_id.name,
'customer': order.partner_id.name,
'state': order.state,
# 假設你需要成本,使用 invoice_id 或其他字段替代 repair_fee
'cost': order.amount_total if hasattr(order, 'amount_total') else 'N/A'
})
# 返回 JSON 響應
return http.Response(
json.dumps({'status': 'success', 'orders': order_list}),
content_type='application/json'
)
在這個控制器中,我們定義了一個路由 /repair/orders
。當訪問這個路由時,系統會使用 ORM 查詢 repair.order
模型中的所有訂單,並將其轉換為 JSON 格式返回給客戶端。
使用 Postman 測試 GET API
現在,我們可以使用 Postman 來測試這個 API。Postman 是一個強大的 API 測試工具,允許我們發送 HTTP 請求並檢視伺服器的回應。
打開 Postman 並創建新請求:
打開 Postman,點擊 "New" 按鈕,選擇 "Request" 創建一個新請求。將請求命名為 "Get Repair Orders"。
設置 GET 請求:
GET
。http://localhost:8069/repair/orders
(假設 Odoo 正在本地端口 8069 上運行)。Content-Type
為 application/json
。如果配置正確,你應該會收到一個 JSON 響應,包含所有維修訂單的詳細信息。
在後台新增資料後測試
可以通過 Odoo 的後台介面手動新增一筆維修訂單,然後使用剛剛在 Postman 中設置的 GET 請求來檢查新資料是否被正確返回。這樣可以驗證 API 是否能夠動態反映資料庫中的變更。
通過這篇文章,我們展示了如何使用 Odoo 的 ORM 來查詢資料,並通過 GET API 返回資料以供外部系統或應用程式使用。這種方法可以輕鬆地將 Odoo 中的業務數據暴露給其他服務,並確保數據的一致性。Postman 提供了一個便捷的環境來測試和驗證 API 功能,使得開發和調試變得更加高效。這種方法非常適合需要定期查詢或整合 Odoo 資料的場景。
補充sudo
auth='public'
不工作?當你使用 auth='public'
時,路由的訪問是公開的,任何人都可以訪問這個 API。然而,模型(如 repair.order
)的讀取權限仍然受限於 Odoo 的訪問控制規則。
repair.order
模型,因為 Odoo 預設不會為匿名用戶提供這樣的權限。auth='public'
允許所有用戶訪問這個路由,匿名用戶也仍然缺乏訪問 repair.order
的權限,導致 403 Forbidden 錯誤。sudo()
繞過權限檢查要讓匿名用戶能夠訪問 repair.order
資料,你需要使用 sudo()
來繞過權限檢查,這樣可以忽略 Odoo 的權限規則,允許任何用戶(包括未登錄的用戶)讀取 repair.order
資料。
sudo()
?Odoo 的權限系統非常嚴格,默認情況下,只有特定用戶組才能訪問某些模型。即使你將路由設置為 auth='public'
,Odoo 還會檢查用戶是否有權限訪問數據。當你使用 sudo()
,你可以繞過這些檢查,允許公開訪問數據。
sudo()
?當你確定 API 應該對所有用戶(包括未登錄用戶)公開時,並且該用戶不應受到 Odoo 權限系統的限制,你可以使用 sudo()
。這會使得 API 以超級用戶身份運行,從而繞過權限檢查。
sudo()
?如果你不希望繞過 Odoo 的權限系統,而是希望通過配置來讓未登錄用戶獲得訪問權限,你需要修改 Odoo 的權限配置。