考虑以下效率问题:
some_date = fields.Date(default="1999-01-01")
days_since_some_date = fields.Integer(compute='_compute_days')
@api.multi
def _compute_days(self):
today = datetime.datetime.now().date()
for r in self:
r.days_since_some_date = (today - datetime.datetime.strptime(r.some_date, '%Y-%m-%d').days
如果days_since_some_date显示在某个对象的树视图中,则每次刷新时都会重新计算此值,并且在任何给定的日期内,几乎不会更改。也就是说,如果手动更改some_date字段中的日期,此值每天递增1,否则只会改变。
理想情况下,人们希望避免在每次刷新时重新计算此值,但不能将其存储起来,因为它不会每天增加。类似地,它不仅仅依赖于some_date字段,使其成为依赖于当前日期和some_date字段的混合体。
问题是,一个绑定到Odoo框架的人如何在不触发对大型记录集进行不必要的维护的情况下拥有这样的字段?
其他想法
人们不能简单地存储该字段,因为它不会每天增加。
由于它取决于some_date(对象的属性)和current_date(不是对象的属性),因此无法对字段进行具体依赖。
我可以运行自动操作来每天重新计算字段,但每当some_date字段更改时,也应该重新评估它。从这个意义上讲,我假设这个解决方案是根据some_date存储,计算字段,并且还强制通过自动化在每日计划中重新计算。这可能有用吗?
答案 0 :(得分:0)
您可以使用ir.cron
模型的自动操作,行为类似于Linux cron作业
基本上你的情况会有这样的事情
<openerp>
<data noupdate="1">
<record id="ir_cron_date" model="ir.cron">
<field name="name">Date cron job</field>
<field name="user_id" ref="base.user_root"/>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field eval="True" name="doall"/>
<field eval="'your.model'" name="model"/>
<field eval="'date_cron_function'" name="function"/>
</record>
</data>
</openerp>
虽然文档没有说明如何使用
稍加参考结帐http://useopenerp.com/v8/model/ir-cron
我无法在文档的任何地方找到它
就我个人而言,我相信这对于任何时候加载表单而言重新计算日期对于python,odoo或服务器来说都不是一项昂贵的操作。