python - ODOO 10 多对多

标签 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 部分来自哪里以及如何防止它。如果有人可以帮助我,我将不胜感激......谢谢!

最佳答案

错误消息与预期有点不同,但我可以修复您代码中的一些问题。首先,您必须考虑到 product.product 对象是 product.template 对象的变体,因此您可以在数据库中拥有许多 指向相同 product.template 的 Product.product 对象(例如 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 通过委托(delegate)继承自 product.template,这意味着您在 product.template 模型中创建的每个字段都将在 product.product 对象中可用,因此当您在 product.template 中创建 Many2many 字段 x_traders_stock 时,您也在 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 对象。

关于python - ODOO 10 多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47651097/

相关文章:

python - 使用 python 抓取网站返回 []

sql - 如何将比率四舍五入到 Postgresql 中的最低整数值?

python - ### 在使用 Python 创建的 Excel 中打开 CSV 文件时的字符

python - 安装 pip-2.7

python - BigQuery python 插入记录 (\w client.insert_rows)

python - Tornado 应用程序布局。选项。

MySql:优化查询

python-2.7 - 无法在jupyter/python2.7.5中使用line_profiler

python字典更新方法来扩展字典

mysql - Laravel - 如何在这里分页?