在Odoo 8中是否有任何方法可以创建仅在满足某些条件时计算的字段,否则用户将能够设置其值?
示例
我有一个名为box
的模型,它有一个名为value
的浮点字段。
想象一下,一个盒子里面可以有几个盒子,每个盒子都有自己的值。
所以我们有一个名为child_ids
的one2many字段指向box
,而另一个名为parent_id
的字段也指向框。
现在我想要以下行为:用户可以设置内部没有任何框的value
字段(表示childs_ids
False ),但是,如果框中至少有一个框(这意味着childs_ids
不是 False ),则必须计算value
字段,它将是其总和孩子value
。
有没有人知道如何实现这种行为?
我把我的代码放在了不行的地方(value
的值总是被重置为0):
class box(models.Model):
_name='box'
@api.one
@api.depends('child_ids', 'child_ids.value')
def _compute_value(self):
if self.child_ids:
self.value = sum(
[child.value for child in self.child_ids])
def _set_value(self):
pass
parent_id = fields.Many2one(comodel_name='box',
string='Parent Box')
child_ids = fields.One2many(comodel_name='box',
inverse_name='parent_id',
string='Boxes inside')
value = fields.Float(
string='Value',
compute='_compute_value',
inverse='_set_value',
store=False,
required=True,
readonly=True,
states={'draft':[('readonly',False)]},
)
答案 0 :(得分:2)
在模型中
computed_field = fields.Char(compute='comp', inverse='inv', store=True)
boolean_field = fields.Boolean()
@api.one
def comp(self):
...
@api.one
def inv(self):
...
视图中的
<field name="boolean_field" />
<field name="computed_field" attrs="{'readonly': [('boolean_field','=',True)]}" />
编辑:
既然你的例子更清楚了,我会说你应该改变以下内容:
将值的商店参数设置为 True 而不是 False ,然后删除反向,在您的情况下,您不需要。
然后你需要另外2个字段
value_manual = fields.Float()
manual = fields.Boolean(compute='_is_manual', default=True)
@api.one
@api.depends('child_ids')
def _is_manual(self):
self.manual = len(self.child_ids) == 0
加
@api.one
@api.depends('child_ids', 'child_ids.value')
def _compute_value(self):
if self.child_ids:
self.value = sum(
[child.value for child in self.child_ids])
else:
self.value = self.value_manual
在视图中:
<field name="manual" invisible="1" />
<field name="value" attrs="{'invisible': [('manual','=',True)]}" />
<field name="value_manual" attrs="{'invisible': [('manual','=',False)]}" />
可能有另一个避免这个双字段的解决方案,可能使用反向,但我不确定。