2017-05-18 79 views
0

我在我的Odoo10模塊中有一個Many2many關係:Book < - > Country。Odoo 10 Many2many保存黑名單

一本書在很多國家都可以買到,一個國家可以被選爲很多書。

在我的視圖中,我選擇了一個複選框小部件,用於讓用戶在可用的書的國家打勾。因此,如果這本書在所有可選擇的國家都有,那麼本書會有很多數據庫條目。

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