Python 如何在Odoo中取消onchange上的One2many字段值链接

Python 如何在Odoo中取消onchange上的One2many字段值链接,python,openerp,odoo-9,Python,Openerp,Odoo 9,我创建了一个模块,用于根据客户将销售订单行添加到PO订单行 当我添加销售订单时,它将添加到采购订单中 我试图从one2many字段中取消特定ID的链接。在图片中添加SO字段 类采购订单(models.Model): _继承=“采购订单” _name=“采购订单” 订单id=fields.Many2many('sale.order',String=“Add order”,domain=“[('partner\u id','child\u of',partner\u id),('state','

我创建了一个模块,用于根据客户将销售订单行添加到PO订单行

当我添加销售订单时,它将添加到采购订单中

我试图从one2many字段中取消特定ID的链接。在图片中添加SO字段

类采购订单(models.Model):
_继承=“采购订单”
_name=“采购订单”
订单id=fields.Many2many('sale.order',String=“Add order”,domain=“[('partner\u id','child\u of',partner\u id),('state','in',('quote','socreated','done')))
@api.onchange('order_id'))
def订单更改(自我):
如果不是自助订单\u ID:
返回{}
如果不是self.partner\u customer\u id:
警告={
“标题”:(“警告!”),
'message':(('必须首先选择合作伙伴!'),
}
#self.order\u id=False
返回{'warning':warning}
行_id=[]
u_id=[]
new_line=self.env['purchase.order.line']
对于以self.order_id表示的qt:
对于self.order\u line.mapped('sale\u order\u id')中的i:
行_id.append(i)
对于在self.order\u id中的u:
如果u.id在第_-id行中:
u_id.append(u)
线路标识。移除(u)
如果行标识和行标识:

lp=self.order\u line.filtered(lambda r:r.sale\u order\u id用于建立关系的字段:-

sale_order_id = fields.Many2one('sale.order', related='sale_order_line_id.order_id', string='Order',
                               store=False)
请尝试赋予属性ondelete='cascade',并将行更改为:-

sale_order_id = fields.Many2one('sale.order', related='sale_order_line_id.order_id', string='Order', ondelete ='cascade'
                               store=False)
如果你这样写的话,当相关的销售订单被删除时,one2many带有关系记录的条目也会被删除。这只是一个例子,你可以这样尝试。
感谢您提供用于建立关系的字段:-

sale_order_id = fields.Many2one('sale.order', related='sale_order_line_id.order_id', string='Order',
                               store=False)
请尝试赋予属性ondelete='cascade',并将行更改为:-

sale_order_id = fields.Many2one('sale.order', related='sale_order_line_id.order_id', string='Order', ondelete ='cascade'
                               store=False)
如果你这样写的话,当相关的销售订单被删除时,one2many带有关系记录的条目也会被删除。这只是一个例子,你可以这样尝试。
谢谢

以下是删除one2many中记录的常见逻辑

@api.onchage('field_name')
def onchange_field_name(self):
  for line in self.one2many_field_records:
    if line.order_id == 'your_satisfying_condition':
        line.unlink()

这是删除订单行记录的常用方法

以下是删除one2many中记录的常用逻辑

@api.onchage('field_name')
def onchange_field_name(self):
  for line in self.one2many_field_records:
    if line.order_id == 'your_satisfying_condition':
        line.unlink()

这是删除订单行记录的常用方法

对不起,我迟到了。这是一个记录时间:


尝试使用
[(5,0,0)]
删除所有记录,然后添加ID。这对我来说是可行的,但唯一的问题是,如果其他字段触发onchange方法,而不是相同的many2many或one2many字段,它就会起作用


但在创建模式下,如果您没有找到任何解决方案,为什么不在他更改所选订单ID时使用更新按钮,他需要在显示one2many字段之前验证,这样您将始终进行写入操作,因为创建将在他验证选择时发生。我想说的是,找到它的工作方式并在其周围工作想办法使用它

对不起,我迟到了,已经很长时间了:

new_lines = self.env['purchase.order.line']
        for qt in self.order_ids:
            for i in self.order_line.mapped('sale_order_id'):
                line_id.append(i.id)
                line_ids.append(i)
            for u in self.order_ids:
                if u.id in line_id:
                    u_id.append(u.id)
                    line_id.remove(u.id)
                    u_ids.append(u)
                    line_ids.remove(u)
            k = self.order_line.mapped('sale_order_id')
            if line_id and line_ids and u_ids:
                lp = self.order_line.filtered(lambda r: r.sale_order_id <= line_ids[0])
                lp6 = self.order_line.filtered(lambda r: r.sale_order_id not in line_ids)
                lp2 = self.order_line.filtered(lambda r: r.sale_order_id in u_ids)

                for line in self.order_line:
                    if line in lp:
                        self.update({
                            'order_line': [(5, _, _)],
                        })
                for o in lp6:
                    data = {
                        'sale_order_line_id': o.sale_order_line_id.id,
                        'name': o.name,
                        'sequence_number': o.sequence_number,
                        'product_id': o.product_id.id,
                        'product_qty': o.product_qty,
                        'product_uom': o.product_uom,
                        'price_unit': o.price_unit,
                        'cpo_no': o.cpo_no,
                        'cpo_product_qty': o.cpo_product_qty,
                        'cpo_product_uom': o.cpo_product_uom,
                        'cpo_price_unit': o.cpo_price_unit,
                        # 'quote_ref':line.order_id.origin,
                        'discount': 0.0,
                        'date_planned': (datetime.today() + relativedelta(weeks=4)).strftime(
                            DEFAULT_SERVER_DATETIME_FORMAT),
                    }
                    for line in qt.order_line:
                                # Load a PO line only once
                        if line in self.order_line.mapped('sale_order_line_id'):
                            continue
                    new_line = new_lines.new(data)
                    new_line._set_additional_fields(self)
                    new_lines += new_line



                    new_line = False

                continue

尝试使用
[(5,0,0)]
删除所有记录,然后添加ID。这对我来说是可行的,但唯一的问题是,如果其他字段触发onchange方法,而不是相同的many2many或one2many字段,它就会起作用


但在创建模式下,如果您没有找到任何解决方案,为什么不在他更改所选订单ID时使用更新按钮,他需要在显示one2many字段之前验证,这样您将始终进行写入操作,因为创建将在他验证选择时发生。我想说的是,找到它的工作方式并在其周围工作找到使用它的方法

new\u lines=self.env['purchase.order.line']
new_lines = self.env['purchase.order.line']
        for qt in self.order_ids:
            for i in self.order_line.mapped('sale_order_id'):
                line_id.append(i.id)
                line_ids.append(i)
            for u in self.order_ids:
                if u.id in line_id:
                    u_id.append(u.id)
                    line_id.remove(u.id)
                    u_ids.append(u)
                    line_ids.remove(u)
            k = self.order_line.mapped('sale_order_id')
            if line_id and line_ids and u_ids:
                lp = self.order_line.filtered(lambda r: r.sale_order_id <= line_ids[0])
                lp6 = self.order_line.filtered(lambda r: r.sale_order_id not in line_ids)
                lp2 = self.order_line.filtered(lambda r: r.sale_order_id in u_ids)

                for line in self.order_line:
                    if line in lp:
                        self.update({
                            'order_line': [(5, _, _)],
                        })
                for o in lp6:
                    data = {
                        'sale_order_line_id': o.sale_order_line_id.id,
                        'name': o.name,
                        'sequence_number': o.sequence_number,
                        'product_id': o.product_id.id,
                        'product_qty': o.product_qty,
                        'product_uom': o.product_uom,
                        'price_unit': o.price_unit,
                        'cpo_no': o.cpo_no,
                        'cpo_product_qty': o.cpo_product_qty,
                        'cpo_product_uom': o.cpo_product_uom,
                        'cpo_price_unit': o.cpo_price_unit,
                        # 'quote_ref':line.order_id.origin,
                        'discount': 0.0,
                        'date_planned': (datetime.today() + relativedelta(weeks=4)).strftime(
                            DEFAULT_SERVER_DATETIME_FORMAT),
                    }
                    for line in qt.order_line:
                                # Load a PO line only once
                        if line in self.order_line.mapped('sale_order_line_id'):
                            continue
                    new_line = new_lines.new(data)
                    new_line._set_additional_fields(self)
                    new_lines += new_line



                    new_line = False

                continue
对于以self.order_id表示的qt: 对于self.order\u line.mapped('sale\u order\u id')中的i: 行\u id.append(i.id) 行_id.append(i) 对于在self.order\u id中的u: 如果u.id在第_-id行中: u_id.追加(u.id) 线路标识移除(u.id) u_id.append(u) 线路标识。移除(u) k=self.order\u line.mapped('sale\u order\u id')) 如果线路标识和线路标识以及线路标识: lp=self.order\u line.filtered(lambda r:r.sale\u order\u id
new\u line=self.env['purchase.order.line']
对于以self.order_id表示的qt:
对于self.order\u line.mapped('sale\u order\u id')中的i:
行\u id.append(i.id)
行_id.append(i)
对于在self.order\u id中的u:
如果u.id在第_-id行中:
u_id.追加(u.id)
线路标识移除(u.id)
u_id.append(u)
线路标识。移除(u)
k=self.order\u line.mapped('sale\u order\u id'))
如果线路标识和线路标识以及线路标识:

lp=self.order\u line.filtered(lambda r:r.sale\u order\u id它不起作用,实际上我正在从采购订单中删除订单id[many2many],我想从采购订单中删除相应的订单id它不起作用,实际上我正在删除订单id[many2many]从Purcahes order和我想从订单行中删除相应的订单id当您更改订单id时,所选SO的行会正常添加,但当您删除它时,这些行不会添加?是。如果我从订单id中删除任何添加的id,我想从订单行中删除其行,请尝试使用[(5,0,0)]然后添加ID。这对我有效,但唯一的问题是,如果其他字段触发onchange方法,它会起作用,而不是相同的many2many或one2many字段,但是[(5,0,0)]在create()中不起作用对吗?如果你没有找到任何解决方案,为什么不在他更改所选订单ID时使用“更新”按钮,他需要在显示one2many字段之前进行验证,这样你就可以一直进行写操作,因为当他验证选择时,会发生创建。我想说的是,找到它的工作方式,并在它周围工作,以找到一种当您更改所选SO的行的顺序时,请使用它添加或