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_chars
as 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.