我在 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.productproduct.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/