odoo api装饰器 one、model和multi区别

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

odoo api装饰器 one、model和multi区别

北方男孩   2020-06-04 我要评论

## @api.one

新api定义:

1 qty = fields.Integer(string="qty", compute="_get_qty")
2 
3     @api.one
4     def _get_qty(self):
5         self.qty = random.ranint(1, 10)

one一般使用再无返回值,就算添加return也不会返回,也不会报错,版本10以后逐渐淡化

## model

新api定义

@api.model
    def create(self, vals):
        bom_obj = self.search([("product_tmpl_id", '=', vals.get('product_tmpl_id', None))])
        if bom_obj:
            raise UserError('该产品已存在相应的物料清单')
        return super(MrpBom, self).create(vals)

注意:这个方法的注释是这样的:修饰记录样式的方法,其中``self``是记录集,但和内容无关紧要,只有模型相关

假如上面使用mutil装饰就会出错,提示参数个数的报错, 此方法可以有返回值

def model(method):
    """ Decorate a record-style method where ``self`` is a recordset, but its
        contents is not relevant, only the model is. Such a method::

            @api.model
            def method(self, args):
                ...

        may be called in both record and traditional styles, like::

            # recs = model.browse(cr, uid, ids, context)
            recs.method(args)

            model.method(cr, uid, args, context=context)

        Notice that no ``ids`` are passed to the method in the traditional style.
    """
    method._api = 'model'
    return method

## mutil

新api定义

@api.multi
    def search_recursively_line_product(self):
        product_ids = set()
        for rec in self:
            for bom_line in rec.bom_line_ids:
                product_ids.add(bom_line.product_id.id)
                product_tmpl_id = self.env['product.product'].browse(bom_line.product_id.id).product_tmpl_id.id
                bom_line_bom = self.search([('product_tmpl_id', '=', product_tmpl_id)])
                if bom_line_bom.bom_line_ids:
                    product_ids |= bom_line_bom.search_recursively_line_product()
        return product_ids

注:mutil和one时对应的,可以返回一个或者回个记录集

修饰一个记录样式的方法,其中``self``是一个记录集,通常定义对记录的操作

def multi(method):
    """ Decorate a record-style method where ``self`` is a recordset. The method
        typically defines an operation on records. Such a method::

            @api.multi
            def method(self, args):
                ...

        may be called in both record and traditional styles, like::

            # recs = model.browse(cr, uid, ids, context)
            recs.method(args)

            model.method(cr, uid, ids, args, context=context)
    """
    method._api = 'multi'
    return method

 

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们