Python 2.7 关于Odoo8中的写入行为

Python 2.7 关于Odoo8中的写入行为,python-2.7,openerp,odoo-8,Python 2.7,Openerp,Odoo 8,我有型号库存.生产.批次。我在这个模型中添加了两个one2many字段,incomming\u moves和outing\u moves,它们都指向modelstock.move。我还在stock.move上添加了一个名为qty的浮动字段。 我在stock.production.lot中添加了两个计算字段,用于计算输入和输出数量 现在,我想禁止出货量高于进货量的批次。为此,我在stock.move中做了一个约束。我知道最合理的选择是在stock.production.lot中进行此约束,但我看到

我有型号
库存.生产.批次
。我在这个模型中添加了两个one2many字段,
incomming\u moves
outing\u moves
,它们都指向model
stock.move
。我还在
stock.move
上添加了一个名为
qty
的浮动字段。 我在
stock.production.lot
中添加了两个计算字段,用于计算输入和输出数量

现在,我想禁止出货量高于进货量的批次。为此,我在
stock.move
中做了一个约束。我知道最合理的选择是在
stock.production.lot
中进行此约束,但我看到的问题是在
@api.constraints
decorator中,我不能使用点符号,因此我只能编写
@api.constraints('incoming_moves','outing_moves')
,这意味着如果我修改移动的数量,甚至没有执行此约束

因此,我在
stock.move
中的约束条件是:

@api.one
@api.constrains('qty', 'restrict_lot_id')
def _check_qties(self):
    if (self.in_vqty - self.out_vqty) < 0:
        raise ValidationError(
            _('The incoming quantity (Kg) of the lot is lower than '
              'the outgoing one.')
        )
@api.one
@api.Constraints('数量','限制批次id')
定义检查(自身):
如果(自进自出数量)<0:
引发验证错误(
_(‘该批次的进料数量(Kg)低于’
“即将离任的人。”)
)
它似乎在任何情况下都非常有效,除了以下情况:如果我同时修改同一批次的多个移动的数量(从批次表单的one2many字段),ORM
write
方法行为会使约束产生错误,尽管数量没有问题

示例

我有很多新的动作(InM1)是8次,还有3次是3次 移动1、3和4的(OutM1、OutM2、OutM3)(批次数量=>8-(1+3+4)=0,可以)。我将以这种形式进行讨论 抽签并编辑任何
传出的\u移动
。从那里,我出发了 到2,从3到3,因此该批次的总数量为8- (2+3+3),即0,也可以。但是,当我点击Save按钮时 约束会引发错误。为什么?

事情就是这样:单击保存后,ORM
write
调用
stock.move的方法。第一次,它想要更新
OutM1,它会这样做,但就在那之后,约束被检查
由于OutM3尚未更新,它将收到8-(2+3+4),并且
这就是错误增加的原因

因此,我试图删除约束并在ORM
write
方法中进行检查,但我面临同样的问题。我将检查放在super之后,但是ORM
write
方法被调用了两次,第一次更新OutM1,第二次更新OutM3。在这些操作之间也会引发异常,原因与我上面解释的相同


我如何解决这个问题?

您不应该对整批记录而不是每一条记录逐一进行验证,以确定整个操作是否有效吗?例如:
@api.multi
这就是我想要做的,但是为了检查整批记录,我需要在
stock.production.lot
中应用约束(其中有一个2many字段指向
stock.move
)。问题是,如果我告诉
@api.constraints
依赖于
传入的移动.qty
传出的移动.qty
,那么
@api.constraints
会给我错误,那么我该怎么做呢?这只是一个未经测试的想法:如何将相关字段
传入的移动数量
传出的移动数量
设置为相应的
*\u move.qty
,并对其设置约束?