python
  • postgresql
  • onchange
  • odoo
  • 2015-03-23 5 views 1 likes 
    1

    В product.template модели, у меня есть one2many поле (attribute_line_ids) со ссылкой на следующий класс:Заполните many2many поле от другого many2many поля

    class product_attribute_line(osv.osv): 
    _name = "product.attribute.line" 
    _rec_name = 'attribute_id' 
    _columns = { 
        'product_tmpl_id': fields.many2one('product.template', 'Product Template', required=True, ondelete='cascade'), 
        'attribute_id': fields.many2one('product.attribute', 'Attribute', required=True, ondelete='restrict'), 
        'value_ids': fields.many2many('product.attribute.value', id1='line_id', id2='val_id', string='Product Attribute Value'), 
    } 
    

    С другой стороны, в product.template создал поле many2one ссылаясь на новую модель (comun.denominador):

    'cm_id' : fields.many2one('comun.denominador','Comun denominador', select=True, ondelete='cascade') 
    

    Так что, когда я выбираю «cm_id» он приносит записи в product.template из comun.denominador с помощью on_change функции.

    Это мой onchange_function:

    def on_change_cm_id(self,cr, uid, ids,cm_id,context=None): 
        context=context or {} 
        attributes_product_template = [] 
        value = {} 
        if ids: 
         old_note_ids = self.pool.get('product.attribute.line').search(cr, uid,[('product_tmpl_id','in',ids)]) 
         self.pool.get('product.attribute.line').unlink(cr, uid, old_note_ids) 
        attribute_cm_ids = [] 
        attribute_cm_ids = self.pool.get('attribute.comun.denominador.line').search(cr, uid, [('comun_denominador_id', '=', cm_id)]) 
        for attribute_id in self.pool.get('attribute.comun.denominador.line').read(cr, uid, attribute_cm_ids, ['attribute_comun_denominador_id', 'value_comun_denominador_ids']): 
         attributes_product_template.append((0,0,{'value_ids':attribute_id['value_comun_denominador_ids'][0],'attribute_id':attribute_id['attribute_comun_denominador_id'][0]})) 
        value.update(attribute_line_ids=attributes_product_template) 
        return {'value':value} 
    

    Эти модели хранят информацию в comun.denominador:

    class product_attribute_line(osv.osv): 
    _name = "attribute.comun.denominador.line" 
    _rec_name = 'attribute_comun_denominador_id' 
    _columns = { 
        'comun_denominador_id': fields.many2one('comun.denominador', 'Comun denominador', required=True, ondelete='cascade'), 
        'attribute_comun_denominador_id': fields.many2one('product.attribute', 'Attribute', required=True, ondelete='restrict', readonly=True), 
        'value_comun_denominador_ids': fields.many2many('product.attribute.value', id1='line_id', id2='val_id', string='Product Attribute Value'), 
    } 
    
    class comun_denominador(osv.osv): 
    _name='comun.denominador' 
    _rec_name='comun_denominador' 
    _columns = { 
        'comun_denominador': fields.char('Común denominador', size=10), 
        'code': fields.char('Código clasificación', size=10), 
        'attribute_line_comun_denominador_ids' : fields.one2many('attribute.comun.denominador.line', 'comun_denominador_id', 'Atributos del comun denominador')    
        } 
    

    Как вы можете увидеть в моем onchange_function все, что я хочу сделать, это заполнить поля ' attribute_id ' и ' value_ids ' из модели' product.attribute.line 'со значениями' attribute_comun_denominador_id 'и' value_comun_denominador_ids ' к модели 'attribute.comun.denominador.line'.

    OnChange функция отлично работает с полями many2one ('attribute_comun_denominador_id' -> 'attribute_id'), но в случае many2many полей ('value_comun_denominador_ids' -> 'value_ids'), я получаю эту ошибку:

    File "/home/odoo/openerp/fields.py", line 1568, in convert_to_cache 
        raise ValueError("Wrong value for %s: %s" % (self, value)) 
        ValueError: Wrong value for product.attribute.line.value_ids: 1 
    

    Кто-нибудь знает, как правильно выполнить миграцию между many2many полями?

    ответ

    0
    def on_change_cm_id(self,cr, uid, ids,cm_id,context=None): 
        context=context or {} 
        attributes_product_template = [] 
        value = {} 
        if ids: 
         old_note_ids = self.pool.get('product.attribute.line').search(cr, uid,[('product_tmpl_id','in',ids)]) 
         self.pool.get('product.attribute.line').unlink(cr, uid, old_note_ids) 
        attribute_cm_ids = [] 
        attribute_cm_ids = self.pool.get('attribute.comun.denominador.line').search(cr, uid, [('comun_denominador_id', '=', cm_id)]) 
        for attribute_id in self.pool.get('attribute.comun.denominador.line').read(cr, uid, attribute_cm_ids, ['attribute_comun_denominador_id', 'value_comun_denominador_ids']): 
         attributes_product_template.append((0,0,{'value_ids':[(6,0,[attribute_id['value_comun_denominador_ids'][0]])],'attribute_id':attribute_id['attribute_comun_denominador_id'][0]})) 
        value.update(attribute_line_ids=attributes_product_template) 
        return {'value':value} 
    
    Смежные вопросы