odoo面試問題總結

基礎問題:

  1. Model和TransientModel區別是什麼?什麼場景下應該使用TransientModel?
  2. 字段的compute屬性是用來做什麼的?如何將包含compute屬性的字段的值存儲到數據庫中?
  3. 如何創建一個索引字段?
  4. 如何設置一個字段的默認值?默認值可以是一個函數嗎?
  5. 如何給限定某個字段只能由某個讓用戶組的人訪問?
  6. 如何將某個字段設置爲提權訪問(admin)?
  7. api.model的作用是什麼?
  8. create方法接受的參數是什麼類型?

回答1:

1. Model和TransientModel的區別在於,Model是持久化的,可以在數據庫中保存數據,而TransientModel不會保存到數據庫。應該在需要暫存臨時數據的場景下使用TransientModel。

2. 字段的compute屬性用於計算字段值,通常通過讀取或操作其他字段來計算。這些計算字段的值不會被存儲到數據庫中,

   而是在每次請求時動態生成。如果要將計算字段的值存儲到數據庫中,應該設置store=True屬性。

3. 可以使用@api.depends('field_name')和@api.depends_context('key_name')等裝飾器來創建索引字段。具體實現方式取決於Odoo的版本和所選的ORM。

4. 可以使用默認值屬性(default)或者計算屬性(compute)來設置字段的默認值。默認值可以是函數,但必須返回一個新值而不能修改任何現有對象。

5. 可以使用groups屬性限制某個字段只能由某個用戶組訪問。例如: groups="base.group_user,my_module.my_group"

6. 可以使用access_rights屬性將字段設置爲提權訪問(admin)。例如: access_rights={'write': 'base.group_system'}

7. api.model(也稱爲模型API)提供ORM語法及相關方法,可用於創建、讀取、更新和刪除模型的記錄,還提供了一些輔助函數。

8. create方法接受一個字典類型的參數,包含待創建記錄的字段名和對應的值。例如: {'field_name_1': value_1, 'field_name_2': value_2}

 

 

中級問題:

  1. 什麼是開發者模式?開發者模式中的三種模式的區別是什麼?
  2. modelsinheritinherits的區別是什麼?
  3. Binary字段與附件對象有什麼關係?如何更改附件默認存儲的位置?
  4. base模塊和web模塊分別在系統中扮演什麼樣的角色?
  5. 如何將自定義的widget添加到系統中?
  6. csrf_token是什麼?有什麼作用?是如何生成的?
  7. 爲什麼jsonrpc中不用傳csrf_token?
  8. Session是如何存儲的?odoo是如何判斷Session是否有效的?
  9. 配置文件中的limit_memory_softlimit_memory_hard區別是什麼?
  10. 如何更新系統中全部的模塊?其原理是怎樣的?

回答2:

1. 什麼是開發者模式?開發者模式中的三種模式的區別是什麼?

開發者模式是一種Odoo應用程序的高級用戶界面,它允許開發者和系統管理員以更靈活的方式定製、配置和管理Odoo系統。開發者模式中包含三種模式:

- 普通模式:默認模式,只顯示常用的功能和菜單。
- 調試模式:提供了額外的調試選項,如查看日誌信息、查看數據庫表結構等。
- 工程師模式:最高級別的模式,允許進行系統文件的修改、添加自定義代碼等操作。

2. models中inherit和inherits的區別是什麼?

`inherit` 和 `inherits` 都是Odoo中用於繼承模型的關鍵詞,但它們的作用略有不同:

- `inherit` 用於向一個已存在的模型追加字段,方法和視圖等,可以多次使用。
- `inherits` 用於創建一個新的模型,並從指定的父模型中繼承所有的字段、方法和視圖等。

3. Binary字段與附件對象有什麼關係?如何更改附件默認存儲的位置?

在Odoo中,Binary字段用於存儲二進制數據(例如圖片、文檔等),而附件對象則用於管理這些二進制數據的存儲和訪問。每個附件對象都對應一個二進制數據文件,並在數據庫中存儲一條記錄,該記錄包含了文件的元數據信息(如文件名、文件類型等)。

要更改附件默認存儲的位置,可以設置系統參數 `ir_attachment.location` 的值。默認情況下,此參數爲 `file`,表示將附件文件存儲在文件系統中。如果要將附件文件存儲在Amazon S3或其他雲服務商中,請參考Odoo文檔中的相關說明進行配置。

4. base模塊和web模塊分別在系統中扮演什麼樣的角色?

- `base` 模塊是Odoo系統的核心模塊之一,提供了許多基礎功能,如用戶管理、安全認證、多語言支持、郵件發送等。
- `web` 模塊是Odoo系統中負責處理Web請求和響應的模塊,提供了許多與Web界面相關的功能,如路由、控制器、模板引擎等。

5. 如何將自定義的widget添加到系統中?

要將自定義的widget添加到Odoo系統中,可以按照以下步驟操作:

- 創建一個新的Odoo模塊,包含必要的Python代碼和XML視圖文件。
- 在XML視圖文件中使用 `<script>` 標籤加載自定義widget所需的JavaScript和CSS文件。
- 在Python代碼中繼承 `odoo.http.WebController` 類,並使用 `@http.route()` 裝飾器將自定義widget的路由註冊到系統中。

6. csrf_token是什麼?有什麼作用?是如何生成的?

`csrf_token` 是一種安全措施,用於保護Web應用程序免受跨站請求僞造(CSRF)攻擊。它是一個隨機生成的字符串,每次請求時都必須包含在請求的數據中。Odoo系統中的 `csrf_token` 是通過調用 `_compute_session_token()` 方法生成的,該方法使用用戶的Session ID、當前時間戳和一些其他參數計算出一個唯一的token值。

7. 爲什麼jsonrpc中不用傳csrf_token?

因爲在使用JSON-RPC協議進行通信時,每個請求都會包含一個特殊的 `session_id` 參數,該參數會隨着用戶的登錄而自動獲取。Odoo系統會在用戶登錄時爲其分配一個Session ID,並將其記錄在服務器端。因此,在使用JSON-RPC進行通信時,系統可以直接根據 `session_id` 來驗證用戶身份,無需再使用 `csrf_token` 進行驗證。

8. Session是如何存儲的?odoo是如何判斷Session是否有效的?

在Odoo系統中,Session是以Cookie的形式存儲在客戶端瀏覽器中的。當用戶第一次訪問系統時,系統會生成一個唯一的Session ID,並將其存儲在Cookie中。之後,每次用戶發送請求時,系統都會檢查請求中是否包含有效的Session ID,並根據Session ID查找用戶在服務器端存儲的Session數據。如果Session數據存在且未過期,則可以認爲該Session有效。

系統判斷Session是否有效的具體邏輯如下:

- 首先,系統會檢查請求中是否包含名爲 `session_id` 的參數。
- 如果存在 `session_id`,則系統會嘗試將其與服務器端存儲的Session數據進行匹配。
- 如果匹配成功,則可以認爲Session有效;否則,系統會返回一個錯誤響應,並要求用戶重新登錄。

9. 配置文件中的limit_memory_soft和limit_memory_hard區別是什麼?

`limit_memory_soft` 和 `limit_memory_hard` 是用於限制Odoo進程內存使用的參數,具體區別如下:

- `limit_memory_soft`:表示Odoo進程在消耗了指定量的內存後,應該開始釋放一些不必要的資源以減少內存使用。默認值爲64MB。
- `limit_memory_hard`:表示Odoo進程在消耗了指定量的內存後,應該立即停止運行以防止內存泄漏。默認值爲268435456(即256MB)。

10. 如何更新系統中全部的模塊?其原理是怎樣的?

要更新Odoo系統中所有已安裝的模塊,可以按照以下步驟操作:

- 在命令行中進入Odoo系統的根目錄,並執行以下命令:`./odoo-bin -d <database_name> -u all`
- 上述命令將首先停止當前正在運行的Odoo服務,然後重新啓動服務,並對所有已安裝的模塊執行升級操作。

這個命令的原理是通過調用Odoo系統核心代碼中的 `load()` 方法來加載所有已安裝的模塊,並檢查它們是否需要更新。如果有更新的模塊,則會按照一定的順序執行更新操作,以確保不會出現依賴關係錯誤或其他異常情況。更新完成後,系統會自動重啓以使更改生效。

 

 

高級問題:

  1. Environment對象的作用是什麼?
  2. Registry是什麼?默認的Registry的LRU大小是多少?
  3. odoo的多workder模式如何開啓?單worker和多worker的運行機制有什麼不同?

回答3

 1. 在odoo中,Environment對象是一個重要的工具,它允許Python代碼與數據庫進行交互。它提供了一種可擴展的方式來管理和更新數據模型、記錄和查詢數據庫。

 2. 在odoo框架中,Registry是一個用於註冊和查找模型、視圖、服務等的簡單存儲機制。默認情況下,Registry的LRU大小爲10000。
 3. 要啓用odoo的多worker模式,可以在啓動命令中使用 `--workers` 參數並設置大於1的值。在單worker模式下,所有請求都由一個進程處理;而在多worker模式下,請求會被多個進程同時處理,從而  提高系統的吞吐量。兩種模式的主要區別在於處理客戶端請求的方式不同,單worker模式只有一個工作線程,而多worker模式下有多個工作線程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章