繁体   English   中英

ODOO 10 many2很多

[英]ODOO 10 many2many

我在ODOO 10中有一个many2many关系的问题。 我通过这种方式扩展了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部分来自哪里以及如何防止它。 如果有人可以帮助我,将不胜感激..谢谢!

错误消息与预期的有所不同,但是我可以解决您代码中的一些问题。 首先,你必须考虑到一个product.product对象是的变体product.template对象,这样你就可以在数据库中多有product.product指向同一个对象product.template (如product.template是一件T恤和一个product.product是一件T恤,颜色是红色M )。 这意味着您不能像在这里那样在期望有product.product ID的字段中设置product.template的ID:

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对象,所以当你正在创建的Many2manyx_traders_stockproduct.template ,你”在product.product也重新创建它,因此您不必每次生成x_trader时都添加记录。 相反,您应该更改模型:

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创建一个新的相关字段,该字段为伙伴提供了product.product对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM