Wie aktualisiere ich andere Felder oder Modelle innerhalb der Berechnungsfunktion?

Es gibt 3 Klassen,sync.test.subject.a die many2many Beziehung mit @ hsync.test.subject.b welches von @ geerbt wisync.test.subject.c.

sync.test.subject.b 'sseparated_charsas Feld @ wird durch eine Berechnungsfunktion mit dem Namen @ gefüll_compute_separated_chars was durch die Änderung von @ ausgelöst wisync.test.subject.b 'schars Feld

Die Rolle vonsync.test.subject.c ist grundsätzlich zu setzenchars von seinem eigenenname damit_compute_separated_chars wird ausgelöst.

Das Problem ist, dass ich keine verbliebenen Datensätze löschen kann, die sich auf ein Many2many-Feld beziehen (nämlichsync.test.subject.a übrig gebliebene Datensätze) aus der Compute-Funktion, da das Feld bereits vom System geleert wurde, bevor die Funktion ausgeführt wird, sodass ich die IDs nicht abrufen kann. Ich kann nicht einmal ein temporäres Feld zum Speichern von @ verwendesync.test.subject.a ids, da Änderungen, die nicht mit @ zusammenhängseparated_chars wird nicht vom System innerhalb der Berechnungsfunktion festgeschrieben (Mit Änderungen meine ich wirklich, dass KEINE Änderungen an anderen Feldern desselben Modells oder an anderen Modellen nicht festgeschrieben werden). Wie löse ich das?

Models:

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()

Ansichten:

<?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>

Ich denke, dieses Verhalten wird durch eine verzögerte Implementierung von Odoo verursacht, um Trigger für berechnete Felder zu verarbeiten, anstatt die Trigger korrekt zu behandeln (sequentiell basierend auf den Abhängigkeiten). Sie aktualisieren einfach JEDES berechnete Feld JEDES MAL. Es gibt Änderungen an JEDEM ANDEREN FELD. Aus diesem Grund beschränken sie jede Aktualisierung innerhalb der Berechnungsfunktion auf ein anderes Feld. Denn wenn sie es nicht tun, wird es mit einem rekursiven Rechenfunktionsaufruf explodieren.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage