Python 如何在Odoo中取消onchange上的One2many字段值链接
我创建了一个模块,用于根据客户将销售订单行添加到PO订单行 当我添加销售订单时,它将添加到采购订单中 我试图从one2many字段中取消特定ID的链接。在图片中添加SO字段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','
类采购订单(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 idnew\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的行的顺序时,请使用它添加或