odoo開發筆記--模型字段compute用法


compute屬性,實現的主要功能是,前端界面選擇某個字段的時候,指定與該字段關聯的其他字段可以關聯,並聯動的顯示。

可以和inverse屬性同時使用,不加inverse屬性的話,前端界面的顯示效果只是只讀樣式,不能編輯修改;而加上inverse屬性時候,相應的關聯字段可以修改,

但是,修改后,實際上修改的是原表;即會將原表的數據級聯更改。

class HelloJesson(models.Model):
    _name = 'test.cus_goods_list'
    # rec_name = 'goods_name'
    _inherit = ['mail.thread', 'ir.needaction_mixin']
    _description = 'Test Goods List'

    goods_name = fields.Char(compute='_generate_about_name', string="goods name", inverse='_write_stage_fold') 
    cus_goods_tariff_id = fields.Many2one(comodel_name="other_yourself_model.cus_goods_tariff", string="cus goods Code TS", required=False, )  

    @api.onchange('cus_goods_tariff_id')
    def _generate_about_name(self):
        """根據當前cus_goods_tariff_id的變化 動態關聯顯示goods_name"""
        for goods_list in self:
            if goods_list.cus_goods_tariff_id:
                goods_list.goods_name = goods_list.cus_goods_tariff_id.NameCN

    def _write_stage_fold(self):
        """ inverse='_write_stage_fold' 增加可編輯功能 但是inverse會將原來表中的數據級聯修改"""
        for goods_list in self:
            if goods_list.cus_goods_tariff_id:
                goods_list.cus_goods_tariff_id.NameCN = self.goods_name

 實現compute字段 前端可以編輯修改的方法有兩種:

(1)我們可以在模型定義中,再單獨添加一個字段g_name,然后該字段根據compute生成的那個字段good_name的值進行取值並賦值給g_name;

class HelloJesson(models.Model):
    _name = 'test.cus_goods_list'
    rec_name = 'g_name'
    _inherit = ['mail.thread', 'ir.needaction_mixin']
    _description = 'Test Goods List'

    g_name = fields.Char(string="goods name")  # 商品名稱
    goods_name = fields.Char(compute='_generate_about_name', string="goods name", store=True)  # 商品名稱
    cus_goods_tariff_id = fields.Many2one(comodel_name="other_yourself_model.cus_goods_tariff", string="cus goods Code TS", required=False, )  
                
    @api.onchange('goods_name')
    def change_name(self):
        """由於compute字段前端無法編輯,定義新方法,ID改變生成商品名改變goods_name,再由goods_name的變化,觸發賦值給g_name"""
        for goods_list in self:
            if goods_list.goods_name:
                # goods_list.update({'name': goods_list.goods_name})
                goods_list.g_name = goods_list.goods_name

    @api.depends('cus_goods_tariff_id')
    def _generate_about_name(self):
        """根據cus_goods_tariff_id編碼的變化 改變goods_name"""
        for goods_list in self:
            if goods_list.cus_goods_tariff_id:
                goods_list.goods_name = goods_list.cus_goods_tariff_id.NameCN

 (2)方式二,可以直接將compute屬性去掉,裝飾器使用@api.onchange,可以直接實現前端相關字段動態生成,並且可以編輯的效果。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM