(自动操作)Odoo write() 和 do for 循环问题
(Automated Action) Odoo Problem with write() and do for loop
我正在尝试使用自动操作更新模型 'product.supplierinfo' 中的 'sequence' 值,以便当供应商的价格从采购订单更新时,该供应商会优先计算补货成本。为此,new/updated 记录必须获得该产品的最低 'sequence' 值。
Automated Action Screenshoot
自动操作设置:
型号:product.supplierinfo
操作:执行 Python 代码
条件:创建并更新
这部分py成功重置了从2开始的序列:
val = 1
registers = model.search([('product_tmpl_id','=',record.product_tmpl_id.id)], order = "sequence asc")
for reg in registers:
val = val + 1
reg['sequence'] = val
另外一个成功地给 updated/new 行序列值 1:
record.write({'sequence': 1})
但是,当全部放在一起时,所有行都得到序列 1:
val = 1
registers = model.search([('product_tmpl_id','=',record.product_tmpl_id.id)], order = "sequence asc")
for reg in registers:
val = val + 1
reg['sequence'] = val
record.write({'sequence': 1})
因为我很菜鸟,我什至假设循环可能不会以缩进结束并尝试另一个来证明我遗漏了一些东西(首先将序列 1 设置为目标记录然后删除该记录来自搜索方法)。它仍然在所有寄存器的序列值上得到 1:
record.write({'sequence': 1})
val = 1
registers = model.search([('product_tmpl_id','=',record.product_tmpl_id.id),('id','!=', record.id)], order = "sequence asc")
for reg in registers:
val = val + 1
reg['sequence'] = val
知道为什么它不设置触发记录的序列 1,然后从 2 开始设置其余序列吗?
在@CZoellner 的帮助下,我们发现我的代码在所有记录中创建了一个循环 运行,当编辑序列值时,它会再次触发自动操作。由于某种原因,它不会引发无限循环错误。
但是,成功的解决方案是检查记录组中的最大值 write.date
,以验证自动操作是否已经通过它。
最终的工作代码是:
val = 1
fmt = '%Y-%m-%d %H:%M:%S'
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
d2 = datetime.datetime.strptime(now, fmt)
registers = env['product.supplierinfo'].search([('product_tmpl_id','=',record.product_tmpl_id.id),('id','!=', record.id)], order = "sequence asc")
maxi = max(reg.write_date for reg in registers)
d1 = datetime.datetime.strptime(maxi, fmt)
diff = (d2-d1).seconds
if diff > 1:
for reg in registers:
val = val + 1
reg['sequence'] = val
record.write({'sequence': 1})
感谢@CZoellner 的合作
我正在尝试使用自动操作更新模型 'product.supplierinfo' 中的 'sequence' 值,以便当供应商的价格从采购订单更新时,该供应商会优先计算补货成本。为此,new/updated 记录必须获得该产品的最低 'sequence' 值。
Automated Action Screenshoot
自动操作设置: 型号:product.supplierinfo 操作:执行 Python 代码 条件:创建并更新
这部分py成功重置了从2开始的序列:
val = 1
registers = model.search([('product_tmpl_id','=',record.product_tmpl_id.id)], order = "sequence asc")
for reg in registers:
val = val + 1
reg['sequence'] = val
另外一个成功地给 updated/new 行序列值 1:
record.write({'sequence': 1})
但是,当全部放在一起时,所有行都得到序列 1:
val = 1
registers = model.search([('product_tmpl_id','=',record.product_tmpl_id.id)], order = "sequence asc")
for reg in registers:
val = val + 1
reg['sequence'] = val
record.write({'sequence': 1})
因为我很菜鸟,我什至假设循环可能不会以缩进结束并尝试另一个来证明我遗漏了一些东西(首先将序列 1 设置为目标记录然后删除该记录来自搜索方法)。它仍然在所有寄存器的序列值上得到 1:
record.write({'sequence': 1})
val = 1
registers = model.search([('product_tmpl_id','=',record.product_tmpl_id.id),('id','!=', record.id)], order = "sequence asc")
for reg in registers:
val = val + 1
reg['sequence'] = val
知道为什么它不设置触发记录的序列 1,然后从 2 开始设置其余序列吗?
在@CZoellner 的帮助下,我们发现我的代码在所有记录中创建了一个循环 运行,当编辑序列值时,它会再次触发自动操作。由于某种原因,它不会引发无限循环错误。
但是,成功的解决方案是检查记录组中的最大值 write.date
,以验证自动操作是否已经通过它。
最终的工作代码是:
val = 1
fmt = '%Y-%m-%d %H:%M:%S'
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
d2 = datetime.datetime.strptime(now, fmt)
registers = env['product.supplierinfo'].search([('product_tmpl_id','=',record.product_tmpl_id.id),('id','!=', record.id)], order = "sequence asc")
maxi = max(reg.write_date for reg in registers)
d1 = datetime.datetime.strptime(maxi, fmt)
diff = (d2-d1).seconds
if diff > 1:
for reg in registers:
val = val + 1
reg['sequence'] = val
record.write({'sequence': 1})
感谢@CZoellner 的合作