Como atualizo outros campos ou outros modelos da função de computação interna?

Existem 3 classes,sync.test.subject.a que tem muitas relações comsync.test.subject.b que é herdado porsync.test.subject.c.

sync.test.subject.béseparated_chars O campo é preenchido por meio de uma função de computação chamada_compute_separated_chars que é desencadeado pela mudança desync.test.subject.béchars campo.

O papel desync.test.subject.c é basicamente definirchars por conta próprianame de modo a_compute_separated_chars é acionado.

O problema é que não consigo excluir os registros que estão relacionados a um campo Many2many (ou seja,sync.test.subject.a sobras de registros) de dentro da função de computação, porque ANTES da função ser executada, o campo já está esvaziado pelo sistema, portanto não consigo obter os IDs. Eu não posso nem usar o campo temporário para armazenarsync.test.subject.a ids porque quaisquer alterações não relacionadas aseparated_chars não será confirmado pelo sistema a partir da função de computação (com qualquer alteração, quero dizer QUALQUER ALTERAÇÃO em outros campos do mesmo modelo ou outras alterações em outros modelos não serão confirmadas). Como eu resolvo isso?

Modelos:

from openerp import models, fields, api, _

class sync_test_subject_a(models.Model):

    _name           = "sync.test.subject.a"

    name            = fields.Char('Name')

sync_test_subject_a()

class sync_test_subject_b(models.Model):

    _name           = "sync.test.subject.b"

    chars           = fields.Char('Characters')
    separated_chars = fields.Many2many('sync.test.subject.a',string='Separated Name', store=True, compute='_compute_separated_chars')

    @api.one
    @api.depends('chars')
    def _compute_separated_chars(self):
        a_model = self.env['sync.test.subject.a']
        if not self.chars:
            return
        self.separated_chars.unlink()
        #DELETE LEFTOVER RECORDS FROM a_model
        for character in self.chars:
            self.separated_chars += a_model.create({'name': character})

sync_test_subject_b()

class sync_test_subject_c(models.Model):

    _name           = "sync.test.subject.c"
    _inherit        = "sync.test.subject.b"

    name            = fields.Char('Name')

    @api.one
    def action_set_char(self):
        self.chars = self.name

sync_test_subject_c()

Visualizações:

<?xml version="1.0" encoding="UTF-8"?>
<openerp>
    <data>
        <!-- Top menu item -->
        <menuitem name="Testing Module"
            id="testing_module_menu"
            sequence="1"/>

        <menuitem id="sync_test_menu" name="Synchronization Test" parent="testing_module_menu" sequence="1"/>

        <!--Expense Preset View-->
        <record model="ir.ui.view" id="sync_test_subject_c_form_view">
            <field name="name">sync.test.subject.c.form.view</field>
            <field name="model">sync.test.subject.c</field>
            <field name="type">form</field>
            <field name="arch" type="xml">
                <form string="Sync Test" version="7.0">
                    <header>
                    <div class="header_bar">
                        <button name="action_set_char" string="Set Name To Chars" type="object" class="oe_highlight"/>
                    </div>
                    </header>
                    <sheet>
                        <group>
                            <field string="Name" name="name" class="oe_inline"/>
                            <field string="Chars" name="chars" class="oe_inline"/>
                            <field string="Separated Chars" name="separated_chars" class="oe_inline"/>
                        </group>
                    </sheet>
                </form>
            </field>
        </record>

        <record model="ir.ui.view" id="sync_test_subject_c_tree_view">
            <field name="name">sync.test.subject.c.tree.view</field>
            <field name="model">sync.test.subject.c</field>
            <field name="type">tree</field>
            <field name="arch" type="xml">
                <tree string="Class">
                    <field string="Name" name="name"/>
                </tree>
            </field>
        </record>

        <record model="ir.ui.view" id="sync_test_subject_c_search">
            <field name="name">sync.test.subject.c.search</field>
            <field name="model">sync.test.subject.c</field>
            <field name="type">search</field>
            <field name="arch" type="xml">
                <search string="Sync Test Search">
                    <field string="Name" name="name"/>
                </search>
            </field>
        </record>

        <record id="sync_test_subject_c_action" model="ir.actions.act_window">
            <field name="name">Sync Test</field>
            <field name="res_model">sync.test.subject.c</field>
            <field name="view_type">form</field>
            <field name="domain">[]</field>
            <field name="context">{}</field>
            <field name="view_id" eval="sync_test_subject_c_tree_view"/>
            <field name="search_view_id" ref="sync_test_subject_c_search"/>
            <field name="target">current</field>
            <field name="help">Synchronization Test</field>
        </record>

        <menuitem action="sync_test_subject_c_action" icon="STOCK_JUSTIFY_FILL" sequence="1"
            id="sync_test_subject_c_action_menu"  parent="testing_module.sync_test_menu"
        />
    </data>
</openerp>

Eu acho que esse comportamento é causado por uma implementação preguiçosa do Odoo para manipular os gatilhos de campo computado em cadeia, em vez de manipular os gatilhos corretamente (sequencialmente com base nas dependências); eles apenas atualizam TODOS os campos computados TODAS AS VEZES, há alterações em TODOS OS OUTROS CAMPOS. E, por isso, restringem qualquer atualização a qualquer outro campo de dentro da função de computação. Porque se não o fizerem, explodirá com a chamada de função de computação recursiva.

questionAnswers(1)

yourAnswerToTheQuestion