Odoo 14:清除 onchange 上的相关记录不会删除数据库条目

问题描述 投票:0回答:1

我正在使用 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 方法时数据库记录也被清除。

python odoo
1个回答
0
投票

只有在保存记录后,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)]

所以改变就是一次性保存每一次改变,包括“清除”操作。

© www.soinside.com 2019 - 2024. All rights reserved.