如果在Odoo 8中满足某些条件,如何计算字段?

时间:2016-02-09 13:20:24

标签: python-2.7 openerp odoo-8

在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)]},
    )

1 个答案:

答案 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)]}" />

可能有另一个避免这个双字段的解决方案,可能使用反向,但我不确定。

相关问题