1. 程式人生 > >odoo 基於SQL View視圖的model類

odoo 基於SQL View視圖的model類

readonly round elf XML filter span part 情況 技術

在做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視圖

技術分享圖片

這樣不管以後遇見多麽復雜的多表查詢條件或者報表,就多了一種選擇,或許是一個不錯的思路。

odoo 基於SQL View視圖的model類