我有这个方法:
@api.multi
@api.constrains('order_lines', 'order_lines.qty', 'order_lines.isbn')
def check_quantity(self):
for rec in self:
if rec.order_lines:
for line in rec.order_lines:
if line.qty > line.isbn.qty_available:
raise Warning(('Quantity is invalid.'))
if not line.isbn:
raise Warning(('Enter at least 1 ISBN to produce'))
else:
self.write({'state': 'inprogress',},)
它完全适用于qty_available
条件和inprogress
状态,但如果我不为{{isbn
添加任何Many2one
1}}它不会抛出任何错误,但也不起作用。
它应该提出product.product
警告,但它只是加载而且就是它。
如果您需要进一步说明,请告诉我。
答案 0 :(得分:1)
试试这个,我做了一些修改,我使用ValidationError而不是警告,并且不使用@api.multi
,系统将在我们使用@api.one
时使用constraint
,并且有一个注释最后一行
from openerp.exceptions import ValidationError
#@api.constrains('order_lines', 'order_lines.qty', 'order_lines.isbn')
@api.one
def check_quantity(self):
for line in self.order_lines:
if line.isbn.qty_available and (line.qty > line.isbn.qty_available):
raise ValidationError("Quantity is invalid. %s" % line.qty)
if not line.isbn:
raise ValidationError('Enter at least 1 ISBN to produce')
else:
self.write({'state': 'inprogress',},) # here you have used @api.multi, and this not correct
答案 1 :(得分:1)
不要在循环中使用self
始终记住,因为如果你打电话
它将应用于其中的所有记录的方法。
并且不要在@api.constrains
或depends
内调用write,否则会导致递归错误。因为这两个装饰器是用create
或write
方法调用的。
@api.multi
@api.constrains('order_lines', 'order_lines.qty', 'order_lines.isbn')
def check_quantity(self):
for rec in self:
if rec.order_lines:
for line in rec.order_lines:
if not line.isbn:
# and check for the product before the quantity
# because if there is no product line.isbn.qty_available
# will raise exception
raise Warning(('Enter at least 1 ISBN to produce'))
if line.qty > line.isbn.qty_available:
raise Warning(('Quantity is invalid.'))
else:
# if you use self here you will update all records
# and don't use write in the constrains
# try to use update it may work if not you need to override write or create method
rec.update({'state': 'inprogress',},)
# or if you are changing just one field
# rec.state = 'inprogress'