Openerp 有效地显示自。。。在奥多

Openerp 有效地显示自。。。在奥多,openerp,odoo-8,openerp-8,Openerp,Odoo 8,Openerp 8,考虑以下效率问题: 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

考虑以下效率问题:

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
如果在某个对象的树状视图中显示自某个日期起的天数,则每次刷新时都会重新计算该值,并且在任何给定的一天中,该值几乎不会更改。也就是说,该值每天递增一,只有在手动更改some_date字段中的日期时,该值才会更改

理想情况下,人们希望避免在每次刷新时重新计算此值,但不能将其存储,因为这样它就不会每天递增。类似地,它不仅仅依赖于some_date字段,使其成为既依赖于当前日期又依赖于some_date字段的混合体

问题是,绑定到Odoo框架的人如何才能拥有这样一个字段,而不会触发对大型记录集的不必要维护

其他想法

  • 不能简单地存储字段,因为它不会每天递增

  • 无法对字段建立具体的依赖关系,因为它同时依赖于某个_日期(对象的属性)和当前的_日期(不是对象的属性)

  • 我可以每天运行一个自动操作来重新计算该字段,但是每当some_date字段发生更改时,也应该重新评估该字段。从这个意义上说,我假设这个解决方案是根据某个_日期存储、计算字段,并通过自动化在每日计划中重新计算字段。这可能有用吗


  • 您可以使用
    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>
    
    
    日期cron作业
    1.
    天
    -1
    
    尽管文档中没有说明如何使用它

    作为一个小参考

    我在文件里什么地方都找不到


    我个人认为,无论何时加载表单,重新计算日期对python、odoo或服务器来说都不是一项昂贵的操作,这是一种过分的做法。

    您可以使用
    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>
    
    
    日期cron作业
    1.
    天
    -1
    
    尽管文档中没有说明如何使用它

    作为一个小参考

    我在文件里什么地方都找不到


    我个人认为,无论何时加载表单,重新计算日期对python、odoo或服务器来说都不是一项昂贵的操作。将计算包含在(每天一次)cron作业中肯定会有助于每日增量,但是,我是否能够使计算函数同时依赖于“某个日期”,以便在该字段发生更改时它也会立即更新?是的,您可以使用docorator
    @api.onchange(“某个日期”)
    ,无论何时更改字段,您都可以手动重新计算并增加日期onchange是否仅编辑字段以在UI中显示?使用@api.depends不是更合适吗?是的,你是对的,我的意思是说
    @api.depends
    。更合适的是,如果通过表单(保存时)或另一个模型中的其他计算更改了
    some_date
    的值,则会触发它。另一方面,
    @api.onchange
    仅在通过该模型中的表单(包括a中的计算)更改字段时才会更改(每天一次)cron job当然有助于每日增量,但我是否能够使计算函数同时依赖于“某个日期”,以便在该字段更改时也立即更新?是的,您可以使用docorator
    @api.onchange(“某个日期”)
    ,无论何时更改字段,您都可以手动重新计算并增加日期onchange是否仅编辑字段以在UI中显示?使用@api.depends不是更合适吗?是的,你是对的,我的意思是说
    @api.depends
    。更为恰当的是,如果通过表单(保存时)或其他模型中的其他计算更改了
    some_date
    的值,则会触发它。另一方面,
    @api.onchange
    仅在通过该模型中的表单更改字段时才会被更改