Odoo 10 Many2many保存黑名单

时间:2017-05-18 08:52:15

标签: python openerp odoo-10

我的Odoo10模块中有一个Many2many关系:Book< - >国家。

许多国家都有一本书,很多书都可以选择一个国家。

在我的视图中,我选择一个复选框小部件,让用户勾选该图书可用的国家/地区。因此,如果该书在所有可选择的国家/地区都可用,则本书将有大量数据库条目。

enter image description here

所以,我想知道是否有可能将这些国家保存在未被选中的多种关系中 - 只需保存黑名单。

任何建议表示赞赏!谢谢!

1 个答案:

答案 0 :(得分: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中。 compute的{​​{1}}方法很重要,因为该值未存储在数据库中(否则保存后列表将为空)。

注意:默认情况下,计算字段不可编辑。因此,我们需要设置属性:country_list