ODOO 10 many2many

时间:2017-12-05 10:16:27

标签: python sql python-2.7 odoo-10 odoo

我在ODOO 10中遇到了很多关系问题。 我以这种方式扩展了res.partner:

class ResPartner(models.Model):
    x_bagsdesign = fields.Many2many('product.product',string='Bags Design',relation='bags_design_manufactur')

然后我还扩展了product.template模型:

class product_template_fields(models.Model):
    _inherit = 'product.template'
    x_traders_stock = fields.Many2many(
    'res.partner', string='Traders with access to stock',relation='xtradstock_res_partner_rel')

    @api.multi
    def write(self, vals):

        record = super(product_template_fields, self).write(vals)  
        for singletrader in self.x_traders_stock:
            singletrader.x_bagsdesign = [(4,self.id)]    

        return record

这样,每次在product.template中插入新的x_traders_stock时,都会在res.partner中创建一个新的x_bags_design。

但是..当我在product.template中保存新记录时,我收到一个sql错误:

bad query:  INSERT INTO bags_design_manufactur (res_partner_id, product_product_id)
                    (SELECT a, b FROM unnest(ARRAY[1]) AS a, unnest(ARRAY[7]) AS b)
                    EXCEPT (SELECT res_partner_id, product_product_id FROM bags_design_manufactur WHERE res_partner_id IN (1))

我不明白sql查询的EXCEPT部分来自何处以及如何防止它。如果有人可以提供帮助,我将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:3)

错误消息与预期有点不同,但我可以修复代码中的一些问题。首先,您必须考虑product.product对象是product.template对象的变体,因此您可以在数据库中拥有指向同一{{1}的许多product.product个对象(例如,product.template T恤product.template T恤红色大小M )。这意味着您无法尝试在预期ID为product.product的字段中设置product.template的ID,正如您在此处所做的那样:

product.product

当然,这个错误不会给你收到的错误信息,你的代码的其他部分肯定有问题(我想与singletrader.x_bagsdesign = [(4,self.id)] 模型有关)。

但是,为了解决我上面告诉你的问题,你应该写一下:

bags_design_manufactur

修改

class product_template_fields(models.Model): _inherit = 'product.template' x_traders_stock = fields.Many2many( comodel_name='res.partner', string='Traders with access to stock', relation='xtradstock_res_partner_rel' ) @api.multi def write(self, vals): result = super(product_template_fields, self).write(vals) for prod_templ in self: products = self.env['product.product'].search([ ('product_tmpl_id', '=', prod_templ.id), ]) for singletrader in prod_templ.x_traders_stock: singletrader.write({ 'x_bagsdesign': [(4, product.id) for product in products], }) return result 通过委派从product.product继承,这意味着您在product.template模型中创建的每个字段都将在product.template个对象中可用,因此在您创建时product.product中的 Many2many 字段x_traders_stock,您也在product.template创建了它,因此每次时都不需要添加记录生成x_trader 。相反,你应该改变你的模型:

product.product

然后,如果您想要访问合作伙伴拥有的class ResPartner(models.Model): x_bagsdesign_prod_templ = fields.Many2many( comodel_name='product.template', column1='partner_id', column2='product_tmpl_id', string='Bags Design', relation='xtradstock_res_partner_rel' ) class ProductTemplate(models.Model): _inherit = 'product.template' x_traders_stock = fields.Many2many( comodel_name='res.partner', column1='product_tmpl_id', column2='partner_id', string='Traders with access to stock', relation='xtradstock_res_partner_rel' ) 个对象,您可以这样做:

product.product

如果您更喜欢它,您甚至可以在any_partner.x_bagsdesign_prod_templ.mapped('product_variant_ids') 中创建一个新的相关字段,这会使res.partner个对象成为合作伙伴。