python - 从其他 many2many 字段中填充 many2many 字段

标签 python postgresql onchange odoo

在 product.template 模型中,我有一个 one2many 字段(attribute_line_ids)引用了以下类:

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”时,它会通过 on_change 函数将记录从 comun.denominador 带到 product.template。

这是我的 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 字段之间正确迁移?

最佳答案

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}

关于python - 从其他 many2many 字段中填充 many2many 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29218485/

相关文章:

python - 列表:如何判断列表中的字母是否在单词中?

PHP 在变化时下降

python - 是否可以使用networkx为每个节点绘制多种颜色的图形

python - 比较两个名字和姓氏列表以找到匹配项

python - 显示一个矩阵,在 sympy 中放置一个公因数

postgresql - 为什么我看不到表的列名?

sql - 在 Postgresql 8.2 中编写函数

postgresql - 如何在不重启 postgres 服务器的情况下刷新停用词列表?

javascript - ServiceNow:JavaScript TypeError:无法读取未定义的属性

javascript - 如何监控javascript改变的HTML输入值