我正在使用 Odoo 14,并面临一个问题,即在表单视图中更改选择时无法清除数据库中的相关记录。我有一个 onchange 方法,应该在routing_id更改时清除现有的routing_line_ids,但似乎数据库记录没有按预期删除。
@api.onchange('routing_id')
def onchange_routing_id(self):
if self.routing_id:
# Clear existing routing_line_ids
self.routing_line_ids = [(5,0,0)]
# Create new routing_line_ids data
data_list = []
for line in self.routing_id.line_ids:
data_list.append((0, 0, {
'process_id': line.process_id.id,
'working_hours_minute': line.working_hours_minute,
'prepare_working_hours': line.prepare_working_hours,
'note': line.note,
}))
self.routing_line_ids = data_list
else:
# If routing_id is empty, clear routing_line_ids
self.routing_line_ids = [(5,0,0)]
型号:
class RokeRoutingOrderModel(models.Model):
_inherit = "roke.routing"
_description = "工艺设计订单"
_rec_name = "task_code"
task_code = fields.Char('任务号')
product_id = fields.Many2one('roke.product', string='零件名称', limit=10)
spec = fields.Char('型号')
picture_number = fields.Char('图号')
plan_code = fields.Char('计划号')
order_qty = fields.Float('订单数量')
work_qty = fields.Float('加工数量')
production_date = fields.Date('投产日期', default=fields.Date.today())
submit_date = fields.Date('计划交付日期', default=fields.Date.today())
output_month = fields.Date('产值月份')
is_on_time = fields.Boolean('是否按期交付')
receive_time = fields.Datetime('接收图纸时间')
priority = fields.Selection([("1级", "1级"), ("2级", "2级"), ("3级", "3级"), ("4级", "4级"), ("5级", "5级")],
default='1级', string="优先级")
state = fields.Selection([('未开始', '未开始'), ('进行中', '进行中'), ('已完成', '已完成'), ('取消', '取消')],
string='状态', default='未开始')
production_order_line_id = fields.Many2one('roke.production.order.line', string='生产订单明细')
production_order_id = fields.Many2one(related='production_order_line_id.order_id', string='生产订单', store=True)
is_write = fields.Selection([('创建', '创建'), ('已创建', '已创建'), ('已修改', '已修改'), ('已更新', '已更新')],
default='创建', string='更新标志')
# 添加字段来显示总耗时
duration = fields.Float(string="用时(天)", compute="_compute_duration", store=True)
routing_id = fields.Many2one("roke.routing", string="工艺路线")
# 添加字段来存储工艺路线的明细
routing_line_ids = fields.One2many('roke.routing.line', 'routing_id', string='工艺明细')
finish_time = fields.Datetime(string="完成时间", readonly=True)
重现步骤:
更改表单视图中的routing_id。 触发 onchange 方法。 内存中的routing_line_ids被清除。 但数据库中的相关记录并没有被删除。
预期行为:
更改routing_id后,数据库中所有相关的routing_line_ids记录应被清除。 实际行为:
内存中的routing_line_ids被清除,但数据库记录保持不变。 环境:
Odoo 版本:14 Python 版本:[此处是您的 Python 版本] Postgres 版本:[此处是您的 Postgres 版本] 附加信息:
我已经验证 onchange 方法被正确调用。 我不确定是否需要遵循任何特定步骤或方法来确保触发 onchange 方法时数据库记录也被清除。
只有在保存记录后,onchange 更改的效果才会在数据库中被识别。如果更改
routing_line_ids
两次,则无法删除之前的位置。需要对代码进行以下更改:
@api.onchange('routing_id')
def onchange_routing_id(self):
if self.routing_id:
# Clear existing routing_line_ids
data_list = [(5,0,0)]
# Create new routing_line_ids data
for line in self.routing_id.line_ids:
data_list.append((0, 0, {
'process_id': line.process_id.id,
'working_hours_minute': line.working_hours_minute,
'prepare_working_hours': line.prepare_working_hours,
'note': line.note,
}))
self.routing_line_ids = data_list
else:
# If routing_id is empty, clear routing_line_ids
self.routing_line_ids = [(5,0,0)]
所以改变就是一次性保存每一次改变,包括“清除”操作。