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)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值