2017-05-18 6 views
0

私はOdoo10モジュール内にMany2many関係を持っています:< - >国。Odoo 10 Many2manyブラックリスト保存

本は多くの国で利用可能であり、1つの国を多くの書籍に選ぶことができます。

私のビューの中で、ユーザーが書籍が利用できる国をチェックするためのチェックボックスウィジェットを選択します。したがって、選択可能なすべての国でこの本が利用可能な場合、この本のデータベースエントリはたくさんあります。

enter image description here

だけで選択されていないmany2many関係にそれらの国を保存する可能性があるのであれば、私は思っていた - ちょうどブラックリストを保存します。

何か提案がありがとうございます!ありがとう!

答えて

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_listcomputeメソッドは重要です。値がデータベースに格納されないためです(そうしないと、保存後にリストが空白になります)。

:計算フィールドはデフォルトでは編集できません。したがって、属性を設定する必要があります。readonly=False

関連する問題