首页 文章

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

提问于
浏览
0

在Odoo 8中是否有任何方法可以创建仅在满足某些条件时计算的字段,否则用户将能够设置其值?

Example

我有一个名为 box 的模型,它有一个名为 value 的浮点字段 .

想象一下,一个盒子里面可以有几个盒子,每个盒子都有自己的 Value .

因此,我们有一个名为 child_ids 的one2many字段指向 box ,还有一个名为 parent_id pointig的many2one指向框 .

现在我想要以下行为:用户可以设置一个框内的 value 字段,里面没有任何框(这意味着, childs_ids 为False),但是,如果框内至少有一个框(这意味着, childs_ids 不是假),必须计算 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 回答

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

    编辑:

    既然你的例子更清楚了,我会说你应该改变以下内容:

    value 的store参数设置为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)]}" />
    

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

相关问题