Odoo 10 - 重载 Python 方法

Posted

技术标签:

【中文标题】Odoo 10 - 重载 Python 方法【英文标题】:Odoo 10 - Overloading a Python Method 【发布时间】:2019-05-21 07:39:52 【问题描述】:

我有一个问题。我有一个称为重载 write() 方法的函数。 我有另一个无关的功能,但它会修改字段。

除了它必然调用调用第一个函数的write方法...

有没有办法在某些字段受到影响时不调用 write 方法?

这是我的代码:

Write() 方法:

# Appel cette méthode quand on modifie un enregistrement
    @api.multi
    def write(self, vals):
        result = super(ResPartnerSchool, self).write(vals)
        self.no_duplicate_school_dates()
        if not self.env.context.get('tracking_disable'):
            self.smart_synchronization()
        return result

smart_synchronization() 方法:

@api.multi
def smart_synchronization(self):
    for record in self:
        if record.school_statut == "valid":
            record.create_compte_in_smart()
            if record.school_send_onde and record.school_date_status == fields.Date.today():
                record.prepare_files_for_onde()

方法prepar_files_to_ONDE在我使用这个方法时被调用:

# Méthode CRON pour fermetures contrats à une date saisie par l'agent
    @api.model
    def run_close_old_contracts(self):
        _logger.info("CRON Called for to verify closed dates contracts")
        today = fields.Date.today()
        domain = ['|', '|', ("half_pension_unsubscribe", "=", True),
                            ("nursery_morning_unsubscribe", "=", True),
                            ("nursery_evening_unsubscribe", "=", True)]
        for contract in self.search(domain):
            vals = 
            if contract.school_registration >= today <= contract.school_end_date:
                if contract.half_pension_unsubscribe \
                        and contract.half_pension_unsubscribe_date <= today \
                        and contract.half_pension_status == "2":
                    vals["half_pension_status"] = "3"
                    _logger.info("Contract half pension closed for : " + contract.partner_id.name)
                if contract.nursery_morning_unsubscribe \
                        and contract.nursery_morning_unsubscribe_date <= today \
                        and contract.nursery_status_morning == "2":
                    vals["nursery_status_morning"] = "3"
                    _logger.info("Contract nursery morning closed for : " + contract.partner_id.name)
                if contract.nursery_evening_unsubscribe \
                        and contract.nursery_evening_unsubscribe_date <= today \
                        and contract.nursery_status_evening == "2":
                    vals["nursery_status_evening"] = "3"
                    _logger.info("Contract nursery evening closed for : " + contract.partner_id.name)
                if vals:
                    contract.write(vals)

正是在这个级别调用了我的 write() 方法。你有什么想法吗?

谢谢

【问题讨论】:

是的,当然,第二个参数 'vals' 包含要编辑的字段 你不想为某些字段调用python方法吗? 【参考方案1】:

每当您更新记录上的字段时,假定将调用 write 函数。这是内置在 Odoo ORM 中的。

例如,如果我从数据库中抓取一条记录。

partner = env['res.partner'].browse(1)

然后我更新此合作伙伴记录上的任何字段,它将调用write 函数来设置它们:

# these each will call `write` at some point
partner.name = 'abc'
partner.update('street1': 'My Street')

我强烈建议通读核心存储库 (odoo/models.py) 中 class BaseModel 定义中的基本 ORM 方法。通过unlinkwrite_writeupdatecreate 等,您可以更好地了解幕后发生的事情。

当然,通读official ORM docs 也无妨。

【讨论】:

以上是关于Odoo 10 - 重载 Python 方法的主要内容,如果未能解决你的问题,请参考以下文章

Odoo10/Odoo11 动态进度条 - 在 python 中触发 javascript 函数

odoo遗留问题--无法重载write

整理一下odoo10在windows系统下部署的流程

macOS Sierra(10.12.6), odoo(11.0), Python(3.5.4)配置

odoo10.0在odoo12.0环境的基础上搭建环境

Centos7 解决odoo10打印条形码显示方框的问题