Odoo 10 Many2many 保存黑名单
Odoo 10 Many2many save blacklist
我的 Odoo10 模块中有一个 Many2many 关系:Book <-> Country。
一本书在多个国家有售,多本书可以选择一个国家。
在我的视图中,我选择了一个复选框小部件,让用户勾选可以买到这本书的国家/地区。因此,如果这本书在所有可选择的国家/地区都有售,那么这本书的数据库条目就会很多。
所以,我想知道是否有可能只保存未选择的多对多关系中的那些国家 - 只保存黑名单。
如有任何建议,我们将不胜感激!谢谢!
我为我的任务找到了解决方案。
这是我所做的。也许这对其他人也有帮助。
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
我的 Odoo10 模块中有一个 Many2many 关系:Book <-> Country。
一本书在多个国家有售,多本书可以选择一个国家。
在我的视图中,我选择了一个复选框小部件,让用户勾选可以买到这本书的国家/地区。因此,如果这本书在所有可选择的国家/地区都有售,那么这本书的数据库条目就会很多。
所以,我想知道是否有可能只保存未选择的多对多关系中的那些国家 - 只保存黑名单。
如有任何建议,我们将不胜感激!谢谢!
我为我的任务找到了解决方案。 这是我所做的。也许这对其他人也有帮助。
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