在做odoo的過程中,會涉及到多表的查詢, 尤其是做報表的時候這種情況更甚,這樣下來會做很多的關聯,不是很方便。odoo提供了一種機制,即基於視圖的model類。代碼地址在這里。
具體過程如下:
1.建立model類mssql.employee
1 import logging 2 3 from odoo import models, fields, api 4 from odoo import tools 5 6 _logger = logging.getLogger(__name__) 7 8 9 class MsslEmployee(models.Model): 10 _name = "mssql.employee" 11 _auto = False 12 13 name = fields.Char(readonly=True) 14 employee_no = fields.Char(readonly=True) 15 16 @api.model_cr 17 def init(self): 18 tools.sql.drop_view_if_exists(self.env.cr, self._table) 19 query = """ 20 create view %s as 21 SELECT A.id, A.login as name, B.street as employee_no 22 FROM res_users A 23 left join res_partner B 24 on A.Id = B.user_id 25 """ % self._table 26 self.env.cr.execute(query)
這里的大體過程和普通的model類差不多,主要區別在於
A. _auto 設置為 False, 即不讓odoo框架接管類的處理,而是由我們自己來處理
B.重寫init函數。這里的主要工作是建立和表名一樣的視圖mssql_employee,即有參數self._table決定。這樣odoo可以像處理普通的model類一樣查詢 列表顯示 Form顯示等。
這里我們簡單的進行了視圖的建立,根據實際情況開發自己的視圖。同時注意視圖的字段要和model類中聲名的相一致,尤其是不要忘記了id字段。
2. 建立 list form search action menu等菜單部分。這里和普通model類的情況一樣。
1 <!--view list for mssqlemployee--> 2 <record id="mssql_employee_view_tree" model="ir.ui.view"> 3 <field name="name">mssql_employee_view_tree</field> 4 <field name="model">mssql.employee</field> 5 <field name="arch" type="xml"> 6 <tree> 7 <field name="name"/> 8 <field name="employee_no"/> 9 </tree> 10 </field> 11 </record> 12 13 <record id="mssql_employee_view_form" model="ir.ui.view"> 14 <field name="name">mssql_employee_view_form</field> 15 <field name="model">mssql.employee</field> 16 <field name="arch" type="xml"> 17 <form> 18 <sheet> 19 <group> 20 <group> 21 <field name="name"/> 22 <field name="employee_no"/> 23 </group> 24 </group> 25 </sheet> 26 </form> 27 </field> 28 </record> 29 30 <record id="mssql_employee_view_search" model="ir.ui.view"> 31 <field name="name">mssql_employee_view_search</field> 32 <field name="model">mssql.employee</field> 33 <field name="arch" type="xml"> 34 <search string="Search"> 35 <field name="name" filter_domain="[('name', 'ilike', self)]"/> 36 </search> 37 </field> 38 </record> 39 40 <record id="mssql_employee_action" model="ir.actions.act_window"> 41 <field name="name">mssql_employee_action</field> 42 <field name="res_model">mssql.employee</field> 43 <field name="view_mode">tree,form</field> 44 <field name="search_view_id" ref="mssql_employee_view_search"/> 45 <field name="help" type="html"> 46 <p class="oe_view_nocontent_create"> 47 Click to create a mssql employee. 48 </p> 49 </field> 50 </record> 51 52 <menuitem name="View Mssql Employee" parent="wechat_news" id="mssql_employee_menu" action="mssql_employee_action" sequence="1"/>
3.安裝或升級對應的模塊,查看運行效果。
運行時的list效果
list列表下的篩選效果
Form編輯效果,當然這里沒有 因為字段都設置為了只讀屬性
最后是數據庫里面確實多了個msqql_employee視圖
這樣不管以后遇見多么復雜的多表查詢條件或者報表,就多了一種選擇,或許是一個不錯的思路。