1. 程式人生 > >Odoo8基於資料庫檢視構建模型的用法

Odoo8基於資料庫檢視構建模型的用法

Odoo8基於資料庫檢視構建模型的用法

利用資料庫檢視構建模型來展示時,其實是用了一種偽model的實現方式,建立的檢視名稱與定義的model名稱是一致的,這樣Odoo框架在載入模型時,就可以找到對應的檢視,從而獲取資料來展示,即就是在獲取資料時用檢視來代替表來展示。

1.首先基於資料庫檢視構建的模型,與傳統的model(基於表)的用法有一定的區別,在構建資料庫檢視model時需要注意以下幾點:
- 1.1 定義的檢視名稱必須與model的name一致,否在在載入時會報找不到對應表的錯誤。
- 1.2 _auto = False 引數,因為時基於資料庫是檢視來建立的,所以model中一定要新增_auto = False引數,即不建立資料庫表。
- 1.3 檢視上需要定義ID,因為Odoo框架在載入時時以表的形式去載入的,所以必須要用到ID,如果檢視上沒有對應的ID,則會報錯。
- 1.4 資料庫檢視定義的欄位,一般都獲取對應的ID欄位,在model中定義欄位需要與檢視中的欄位一致,model中的欄位型別對應檢視中獲取的ID的型別,即比如檢視獲取產品的ID,則model中就需要定義對應的產品型別。
- 1.5 init(self, cr) 方法,一般對應的檢視,會定義在model的init方法中,則在初始化model時就會進行載入。
- 1.6 當修改了檢視sql之後,需要重啟升級才能起作用。

2.在使用檢視model時,需要注意以下幾點:
- 2.1 當我們僅做查詢展示視窗,即只是為了顯示利用檢視查詢的彙總資料時,可以將檢視的的ID定義偽row_number來展示,即:row_number() OVER (),但是當我們需要對查詢的tree檢視有其他的操作時,如分組,搜尋,tree檢視新增查詢button時,就必須採用唯一確定的ID,這時,在確定時,有兩種方式,基於主表的id,作為唯一確定的ID,另一種就需要根據情況手動構建唯一性ID。在手動構建ID時,當構建的ID為字串型別時,正常的搜尋、分組查詢是沒有問題的,但是tree檢視上button就會失效,系統會預設設定button的屬性為不可用。所以當需要新增button這種需求時,就必須定義為int型別的,至於如何確定ID,則需要根據具體情況來區別對待。還有一點特別重要,ID在進行轉換時,切記不能直接用to_number等方法來轉換(載入時回報ID為float型別,無法自增錯誤),而是用CAST ** AS INT來進行轉換,這樣轉換的ID 保證為INT型別的,但是需要注意int的長度範圍。
- 2.2 基於資料庫檢視的model使用與查詢展示的,不允許進行更新操作,所 以無法定義form檢視,所以一般為tree檢視。
- 2.3 具體的示例可參考庫存模組中的庫存現有量查詢,以下文件為參考文件:


# 庫存現有量查詢(基於檢視)
class HrpStockQuantOnHandQuantityQuery2(models.Model):
    _name = 'hrp.stock.quant.quantity.on.hand.quantity.query2'
    _description = "Hrp Stock Quant Quantity On Hand Quantity Query"
    _auto = False

    # 1.產品
    product_id = fields.Many2one(comodel_name='product.product', string='Product', help='Product',
                              readonly=True)
    # 2.規格
    specification = fields.Char(string='Specification', help='Specification', readonly=True)
    # 3.數量
    sum_qty = fields.Float(string="Sum Quantity", help="Sum Quantity", readonly=True)
   
    def init(self, cr):
        '''
        在模型初始化的時候更新並建立資料庫檢視
        :param cr:
        :return:
        '''
        tools.sql.drop_view_if_exists(cr, 'hrp_stock_quant_quantity_on_hand_quantity_query2')
        l_view = """
            CREATE OR REPLACE VIEW "public"."hrp_stock_quant_quantity_on_hand_quantity_query2" AS
                SELECT  XXXX。。。。
                  
            """
        cr.execute(l_view)