Как передать идентификатор в self.env odoo?

В таблице «products.template» я создал три поля ширины, длины и gsm. Теперь я хочу получить его в таблице «mrp». Сначала я получу идентификаторы из списка материалов mrp и назначу их переменной с именем prod. Таблица «mrp.bom.line» содержит идентификатор продукта. Итак, через итератор я хочу передать идентификатор продукта, хранящийся в таблице спецификаций mrp, чтобы получить значение ширины, длины и gsm, хранящиеся в таблице product.template. Я получаю сообщение об ошибке как programming error can't adapt type 'product.product'.

@api.multi
def _compute_rim_weight(self):
    bill_of_materials_id=[1,2,3]
    prod = self.env['mrp.bom.line'].browse(bill_of_materials_id)
    for i in prod:
            j = self.env['product.template'].browse(i.product_id)
            self.rim_weight = (j.width * j.length * j.gsm)/20000        
    return self.rim_weight

person Kiran    schedule 02.06.2016    source источник


Ответы (1)


При просмотре ODOO используйте id, а не object.

поэтому просто заменитеbrowse(i.product_id) наbrowse(i.product_id.id), как показано ниже:

j = self.env['product.template'].browse(i.product_id.id)

Еще одна вещь, если в случае product.template есть ** много2одна связь** с model :mrp.bom.line, насколько я понимаю, вам даже не нужен вызов просмотра.

Прямой вызов line.product_id.width ,line.product_id.length, line.product_id.gsm, как показано ниже:

@api.multi
def _compute_rim_weight(self):
    bill_of_materials_ids=[1,2,3]
    bom_lines = self.env['mrp.bom.line'].browse(bill_of_materials_ids)
    for line in bom_lines:            
            self.rim_weight = (line.product_id.width * line.product_id.length * line.product_id.gsm)/20000        
    return self.rim_weight


@api.one
def _compute_rim_weight(self):
    rim_weight   =0
    for line in self.bom_id.bom_line_ids:            
            rim_weight+ = (line.product_id.width * line.product_id.length * line.product_id.gsm)/20000        
    self.rim_weight =rim_weight
person Prakash Kumar    schedule 02.06.2016
comment
В первой строке я жестко кодирую идентификатор спецификации, как автоматизировать его с помощью self.env. Я хочу передать идентификатор спецификации во вторую строку этой функции. - person Kiran; 02.06.2016
comment
_compute_rim_weight вес находится в mrp.bom.line ?? если да, то просто используйте для строки в себе - person Prakash Kumar; 02.06.2016
comment
Не вес. Я хочу передать идентификатор спецификации (1,2,3) во вторую строку. Для идентификатора 1 идентификатор продукта равен 4 и т. д. - person Kiran; 02.06.2016
comment
Методbrowse() принимает идентификаторы, поэтому я хочу избежать жесткого кодирования идентификаторов BOM, таких как (1,2,3), и передачи их для просмотра() - person Kiran; 02.06.2016
comment
как идентификатор _compute_rim_weight, украшенный @pi.multi, поэтому, если _compute_rim_weight weight находится в mrp.bom.line, нам не нужно использовать просматривать, мы можем просто перебирать себя, поскольку я также содержит список объектов модели (если метод украшен @api.multi), надеюсь, вы поняли, что я хочу сказать, просто подтвердите мне, что вес метода calculate_rim_weight находится в модели mrp.bom.line - person Prakash Kumar; 02.06.2016
comment
Эта функция написана в классе mrp.production, а не в mrp.bom.line, вот в чем проблема. - person Kiran; 02.06.2016
comment
AS mrp.production имеет m21 с mrp.bom:bom_id, а mrp.bom имеет 12m с mrp.bom.line:bom_line_ids, поэтому вы можете использовать self.bom_id.bom_line_ids, я отредактировал свой ответ - person Prakash Kumar; 02.06.2016
comment
Спасибо за ответ буду пробовать - person Kiran; 02.06.2016