第二章 深入理解计算字段

我们先从一个例子看起:


class book_store_activity(models.Model):

    _name = "book_store.activity"

    def _get_all_special(self):
        self.all_special = all(self.lines.mapped("special"))

    name = fields.Char("名称")
    lines = fields.Many2many("book_store.activity.line",
                             'activity_id', string="活动图书")
    all_special = fields.Boolean("是否全部特价",compute="_get_all_special")

    def button_test(self):
        print('-----------------')
        print(self.all_special)
        # lines = self.lines
        for line in self.lines:
            line.special = True

        self.lines.modified(["special"])
        print('==============')
        print(self.all_special)



class book_store_activity_line(models.Model):

    _name = "book_store.activity.line"

    activity_id = fields.Many2one("book_store.activity")
    book = fields.Many2one("book_store.book", string="图书")
    special = fields.Boolean("特价",default=False)

请写出self.all_specail的两次输出值.

你以为的输出结果:

--------------
False
========
True

实际的输出结果却是:

------------
False
========
False

为什么? 这就要从计算字段的属性说起.

计算字段会在第一次使用时触发它的计算函数, 然后将结果存储在缓存中. 当后面如果再次使用时,就会直接使用缓存的结果.

如果想要使One2many字段中的字段发生变化时,计算值得到及时的更新, 那么我们需要使用api.depends装饰器将计算函数装饰起来.

最佳实践

不论存储与否, 计算字段都应该将其内部相关的字段用depends装饰器装饰起来.

results matching ""

    No results matching ""