Python @api.constraints在Odoo 8中如何工作?

Python @api.constraints在Odoo 8中如何工作?,python,xml,python-2.7,odoo-8,odoo,Python,Xml,Python 2.7,Odoo 8,Odoo,我试图在Odoo 8中应用约束。我已经阅读了它的解释,并遵循以下示例: 装饰约束检查器。每个参数必须是字段名 在支票中使用。在其中一个已命名的 字段已被修改。(来自) 此装饰器将确保调用装饰函数 创建、写入、取消链接操作。如果满足约束,则函数 应发出带有适当消息的openerp.exceptions.Warning。(来自) 但对我来说,这根本不起作用。我对stock.picking模型进行了约束,该模型依赖于state字段(开始时它依赖于picking\u type\u id、state和mo

我试图在Odoo 8中应用约束。我已经阅读了它的解释,并遵循以下示例:

装饰约束检查器。每个参数必须是字段名 在支票中使用。在其中一个已命名的 字段已被修改。(来自)

此装饰器将确保调用装饰函数 创建、写入、取消链接操作。如果满足约束,则函数 应发出带有适当消息的openerp.exceptions.Warning。(来自)

但对我来说,这根本不起作用。我对
stock.picking
模型进行了约束,该模型依赖于
state
字段(开始时它依赖于
picking\u type\u id
state
move\u line
字段,但为了简化问题,我对其进行了更改):

问题是,当我创建一个新的拾取时,将调用约束,并且不再调用。如果我标记为执行、确认或转移拾取,其状态将更改,但不再调用约束


关于这件事我有什么遗漏吗?有人能帮我吗?

看起来问题可能与它是一个老式的计算字段有关。只需覆盖
库存的
状态
字段和
\u state\u get
方法。使用新型api拾取
模型似乎可以解决问题,并且每次状态更改都会调用约束

class stock_picking(models.Model):
    _inherit = "stock.picking"

    @api.one
    @api.depends('move_lines', 'move_type', 'move_lines.state')
    def _state_get(self):
        self.state = super(stock_picking, self)._state_get(field_name='state', arg=None, context=self._context)[self.id]

    state = fields.Selection(compute=_state_get)

这个解决方法对我很有效。

将您的约束与工作流功能结合起来
class stock_picking(models.Model):
    _inherit = "stock.picking"

    @api.one
    @api.depends('move_lines', 'move_type', 'move_lines.state')
    def _state_get(self):
        self.state = super(stock_picking, self)._state_get(field_name='state', arg=None, context=self._context)[self.id]

    state = fields.Selection(compute=_state_get)