Я думаю, что делал это тысячу раз, но сегодня я не могу этого достичь и у меня много сомнений.
НАЗНАЧЕНИЕ
Мне нужноскопируйте записи поля One2many в мое поле One2many , но изменив значение столбца.Это действие должно быть выполнено методом onchange .
SCENARIO
Я в модели mrp.bom
.Он имеет поле One2many с именем bom_line_ids
.Он также имеет поле Many2one с именем product_id
.
Каждый раз, когда меняется product_id
, я должен автоматически заполнять bom_line_ids
текущей записи ведомости материалов, принимаяданные из поля bom_line_ids
другого перечня материалов.Но эти записи не будут точно такими же, мне нужно изменить столбец.
ПРИМЕР
В методе onchange мне нужноскопируйте набор записей mrp.bom.line(10, 11)
в мое поле One2many , но в моем поле One2many обе записи будут иметь поле line_type
со значением 'standard'
(не имеет значения line_type
значение исходных записей).
МОЯ ПОПЫТКА
Я много чего пробовал.Самая близкая попытка решения была этой.Но это не удается, если текущая запись ведомости материалов еще не сохранена в базе данных из-за _origin
.Ошибка говорит о том, что bom_id
имеет значение NULL и является обязательным ... Проблема заключается в том, что если я не пишу _origin
, эта ошибка возникает всегда, не имеет значения, существует ли текущая ведомость материалов или нет.И если я уберу ключ bom_id
из словаря default
, новые строки будут добавлены в источник One2many вместо моего ...
@api.onchange('product_id')
def onchange_product_id(self):
if self.product_id and \
self.product_id.product_tmpl_id.bom_ids:
# Following lines are only for taking the source BoM
bom_ids = self.product_id.product_tmpl_id.bom_ids.filtered(
lambda r: not r.product_id)
bom_id = bom_ids[0] if bom_ids else False
# Following lines are for doing the copy
new_lines = self.env['mrp.bom.line']
for line in bom_id.bom_line_ids:
new_lines += line.copy(default={
'bom_id': self._origin.id,
'line_type': 'standard',
})
self.bom_line_ids = [(6, 0, new_lines.ids)]
ЗАКЛЮЧЕНИЕ
Я думаю, что я делаю это сложнее, чем он есть, должно быть какое-то более простое решение ... Кто-нибудь знает, как это сделать?