【问题标题】:Call a function on Module Install在模块安装上调用函数
【发布时间】:2016-07-21 12:00:36
【问题描述】:

如何仅在模块安装时调用函数或执行代码(不更新)? 有特定的功能吗?

我想在模块安装时执行此代码:

all_countries = self.env['res.country'].search([])
for country in all_countries:
   _logger.error(country.name)

【问题讨论】:

    标签: openerp odoo-8


    【解决方案1】:

    最好的方法是使用data 文件。

    1. 将数据文件添加到您的 __openerp__ 文件中
    2. 使用noupdate="1" 标志创建数据文件
      • 这表示代码应该运行一次,然后再也不运行
      • 它会在安装时运行,或者如果模块已经安装,那么它会在下次升级模块时运行。
    3. 在数据文件中定义function 元素以触发相应的python 方法

    您可以查看文档here 了解详细信息,但最终结果如下所示:

    __openerp__.py

    {
        ...
        'data': [
            ...
            'data/data.xml',
            ...
        ],
        ...
    }
    

    /data/data.xml

    <openerp>
        <data noupdate="1">
            <function model="res.country" name="method_name"/>
        </data>
    </openerp>
    

    /models/country.py

    from openerp import models
    import logging
    _logger = logging.getLogger(__name__)
    
    class ResCountry(models.Model):
        _inherit = 'res.country'
    
        @api.model
        def method_name(self):
            for country in self.search([]):
               _logger.error(country.name)
    

    【讨论】:

      【解决方案2】:

      我已经实现了一种解决方法,可以在安装/卸载时运行任意代码,详细信息是 described here。在您的情况下,适合编写代码的函数是建议的解决方法中的 create 方法。

      【讨论】:

      • 如果您需要在安装卸载过程中运行某个功能,则您链接的代码是最好的,但如果代码只需要运行一次,则超出必要。数据文件中的function元素,结合noupdate="1"很容易达到想要的效果。
      • 当然,我在实践中也使用了function 标签,但正如您所说,它只能处理安装情况。并对您的评论做一点说明:我提到的选项可以处理“安装和/或卸载”方案,而不仅仅是“安装和卸载”,因为如果您可以省略 createunlink 方法之一不需要。
      猜你喜欢
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 2012-07-22
      • 2014-09-20
      • 2013-10-02
      • 2015-03-26
      • 2011-05-17
      相关资源
      最近更新 更多