odoo 基于SQL View视图的model类


在做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  
 2         "mssql_employee_view_tree" model="ir.ui.view">
 3             "name">mssql_employee_view_tree
 4             "model">mssql.employee
 5             "arch" type="xml">
 6                 
 7                     "name"/>
 8                     "employee_no"/>
 9                 
10             
11         
12 
13         "mssql_employee_view_form" model="ir.ui.view">
14             "name">mssql_employee_view_form
15             "model">mssql.employee
16             "arch" type="xml">
17                 
18 19 20 21 "name"/> 22 "employee_no"/> 23 24 25 26
27
28
29 30 "mssql_employee_view_search" model="ir.ui.view"> 31 "name">mssql_employee_view_search 32 "model">mssql.employee 33 "arch" type="xml"> 34 string="Search"> 35 "name" filter_domain="[('name', 'ilike', self)]"/> 36 37 38 39 40 "mssql_employee_action" model="ir.actions.act_window"> 41 "name">mssql_employee_action 42 "res_model">mssql.employee 43 "view_mode">tree,form 44 "search_view_id" ref="mssql_employee_view_search"/> 45 "help" type="html"> 46

class="oe_view_nocontent_create"> 47 Click to create a mssql employee. 48

49
50
51 52 "View Mssql Employee" parent="wechat_news" id="mssql_employee_menu" action="mssql_employee_action" sequence="1"/>

3.安装或升级对应的模块,查看运行效果。

运行时的list效果

 list列表下的筛选效果

Form编辑效果,当然这里没有 因为字段都设置为了只读属性

最后是数据库里面确实多了个msqql_employee视图

这样不管以后遇见多么复杂的多表查询条件或者报表,就多了一种选择,或许是一个不错的思路。