第二章 深入理解计算字段
我们先从一个例子看起:
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装饰器装饰起来.