2017-12-05 11 views
2

many2many 관계로 ODOO 10에 문제가 있습니다.ODOO 10 many2many

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 

이 방법은 새로운 x_traders_stock가 product.template에 삽입 될 때마다, 새로운를 나는 res.partner이 방법을 확장했다 x_bags_design은 res.partner에도 생성됩니다. (가)에서 오는 방법 방지하는 것입니다 SQL 쿼리의 일부를 EXCEPT 곳

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)) 

이해가 안 : 나는 product.template에 새 레코드를 저장할 때

하지만 .. 나는 SQL 오류가 그것. 누구라도 도와 주시면 감사하겠습니다 ... 감사합니다!

답변

3

오류 메시지가 예상과 약간 다르지만 코드의 일부 문제를 해결할 수 있습니다. 우선 당신이 product.product 객체가 product.template 객체의 변형임을 고려해야한다, 그래서 당신은 데이터베이스에있을 수있는 동일한 product.template (예 : product.template를 가리키는 많은 product.product 객체는 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.template에서

product.product 상속,이 모든 필드는 product.template에서 만든 것을 의미한다 모델은 product.product 개체에서 사용할 수 있으므로 Many2many 필드 x_traders_stock을에 만듭니다.3210을 사용하는 경우 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') 

당신이 그것을 선호하는 경우, 파트너가 가진 product.product 객체를 가져온 res.partner에 새로운 관련 필드를 만들 수도 있습니다.

+0

감사합니다. 예, 제품에 대한 문제는 제품입니다. 제품 및 제품 템플릿은 여전히 ​​내 주요 문제를 해결하지 못한다고 말했습니다. – GiulioG

+0

정말 'bags_design_manufactur'모델에 액세스 할 수있는 곳을 이해할 수 없습니다.나는 아무데도 정의하지 않았고 many2many 관계에있는 나의 코드에서만 언급했다 ... – GiulioG

+0

Many2many의 테이블에'bags_design_manufactur'를 호출했다는 것을 나는 깨닫지 못했다. 나는 나의 대답을 편집했다. – forvas