我在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部分来自何处以及如何防止它。如果有人可以提供帮助,我将不胜感激。谢谢!
答案 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
个对象成为合作伙伴。