2017-05-18 3 views
0

나는 내 Odoo10 모듈 안에 Many2many 관계가 있습니다 : 책 < -> 국가.Odoo 10 Many2many 블랙리스트 저장

도서는 많은 국가에서 제공되며 한 권의 도서를 여러 도서로 선택할 수 있습니다.

내보기에서는 사용자가 책을 사용할 수있는 국가를 선택하게하는 체크 박스 위젯을 선택합니다. 따라서 도서가 선택 가능한 모든 국가에서 사용 가능하다면이 책에 대한 데이터베이스 항목이 많이있을 것입니다. 단지 블랙리스트를 저장 - 단지 선택되지 않은 many2many 관계에있는 국가를 구하기 위해 가능성이있는 경우

enter image description here

그래서 궁금했다.

의견을 보내주십시오. 감사!

답변

0

내 작업에 대한 해결책을 찾았습니다. 내가 한 일은 다음과 같습니다. 다른 사람에게 도움이 될지도 모릅니다. 뷰에서

class Book(models.Model): 
    _name = 'bookstore.book' 

    name = fields.Char() 
    country_list = fields.Many2many('res.country', string='Available in ...', store=False, compute='_get_list', readonly=False) 
    black_list = fields.Many2many('res.country', 'book_country_rel', string='BlackList', store=True) 

    def _get_all_countries(self): 
     return self.env['res.country'].search([]) 

    @api.depends('black_list') 
    def _get_list(self): 
     self.ensure_one() 
     # 1. get all countries 
     all_countries = self._get_all_countries() 
     # 2. get black_list 
     # 3. set all countries not in blacklist 
     self.country_list = all_countries - self.black_list 

    def _get_blacklist_from_country_list(self, country_list): 
     self.ensure_one() 
     all_countries = self._get_all_countries() 

     black_list = [] 
     for c in all_countries: 
      if c.id not in country_list: 
       black_list.append(c.id) 
     return black_list 

    @staticmethod 
    def _get_country_list(values): 
    if ('country_list' in values) and values['country_list']: 
     return values['country_list'][0][2] 
    # else 
    return [] 

    # set blacklist values on create and on write 
    @api.model 
    def create(self, vals): 
     country_list = Book._get_country_list(vals) 
     vals['black_list'] = [[6, False, self._get_blacklist_from_country_list(country_list)]] 
     return super(blacklist_test, self).create(vals) 

    @api.multi 
    def write(self, vals): 
     if 'country_list' in vals: 
      vals['black_list'] = [[6, False, self._get_blacklist_from_country_list(vals['country_list'][0][2])]] 
     return super(blacklist_test, self).write(vals) 

만 국가 목록을 볼 수 있습니다 :

<record model="ir.ui.view" id="book.form"> 
    <field name="name">Bookstore</field> 
    <field name="model">bookstore.book</field> 
    <field name="arch" type="xml"> 
    <form string="Book"> 
     <sheet> 
      <group> 
      <field name="name"/> 
      <field name="country_list" widget="many2many_checkboxes"/> 
      </group> 
     </sheet> 
    </form> 
    </field> 
</record> 

설명 : (country_list에서)보기에서 국가를 선택하면, 참조가 일시적으로 저장된다. 작성 및 기록시 데이터베이스의 모든 국가가 반입되고 country_list에없는 국가 ID는 black_list에 저장됩니다. country_list에 대한 compute 방법은 중요하므로 값이 데이터베이스에 저장되지 않습니다 (그렇지 않으면 저장 후 목록이 비어있게됩니다).

참고 : 계산 된 필드는 기본적으로 편집 할 수 없습니다. 따라서 다음 속성을 설정해야합니다. readonly=False