..

Many2many Field Compute Not Working

문제

product.template에서 품질관리점을 설정하면 product.product와 quality.point(품질관리점) 간의 Many2Many 관계를 설정해야 했다. 그러기 위해서는 계산해서 필드의 값 넣는 compute 옵션을 사용해야했다.

many2many 필드에는 compute를 사용할 수 없을 거라고 생각했는데, 코드를 검색해보니 compute를 사용한 코드가 있어서 아래와 같이 코드를 작성하고 테스트를 위해 디버그를 걸었는데 이상하게 디버그에 걸리지 않았다.

quality_point_ids = fields.Many2many('quality.point', string='Quality Point', compute='_compute_quality_point_ids')

@api.depends('product_tmpl_id.quality_point_id')
def _compute_quality_point_ids(self):
    for product in self:
        quality_point_id = product.product_tmpl_id.quality_point_id.id
        product.quality_point_ids = [(6, 0, [quality_point_id])]

잘못된 문법을 작성했나 싶어 확인해봤지만 아니었고, many2many에서는 안되나 싶어 many2many가 아닌 다른 자료형(Char)으로 해보니 디버그에 걸렸다.

해결

store=True 옵션을 적어주면 된다. store 옵션은 계산된 값을 DB에 저장할 지에 대한 여부인데 기능에 따라 자유롭게 사용할 수 있다.

근데 Many2many 필드에서는 True로 주어야만 compute 메소드가 호출된다.

(왜 그런건지 정확한 이유는 모르겠지만…)

quality_point_ids = fields.Many2many('quality.point', string='Quality Point', 
                                      compute='_compute_quality_point_ids', store=True)

@api.depends('product_tmpl_id.quality_point_id')
def _compute_quality_point_ids(self):
    for product in self:
        quality_point_id = product.product_tmpl_id.quality_point_id.id
        product.quality_point_ids = [(6, 0, [quality_point_id])]