Istnieją 3 klasy, sync.test.subject.a
, które ma wiele2ma relacji z sync.test.subject.b
, która jest dziedziczona przez sync.test.subject.c
.Jak zaktualizować inne pola lub inne modele z poziomu funkcji obliczeniowej?
sync.test.subject.b
„s separated_chars
pole jest wypełniane przez funkcję obliczeniowej zwanej _compute_separated_chars
który jest wyzwalany przez zmianę sync.test.subject.b
” chars
dziedzinie s.
Rola sync.test.subject.c
polega zasadniczo na ustawieniu chars
przez jego własną name
, tak aby wyzwolić _compute_separated_chars
.
Problem polega na tym, że nie mogę usunąć resztek rekordów, które są powiązane z polem Many2many (to jest sync.test.subject.a
pozostałe rekordy) z funkcji obliczeniowej, ponieważ PRZED wykonaniem funkcji pole jest już opróżnione przez system, więc mogę ' t zdobądź identyfikatory. Nie mogę nawet użyć pola tymczasowego do przechowywania identyfikatorów sync.test.subject.a
, ponieważ wszelkie zmiany, które nie są związane z separated_chars
, nie zostaną zatwierdzone przez system od wewnątrz funkcji obliczeniowej (przez wszelkie zmiany, mam na myśli naprawdę ŻADNE zmiany w innych polach z ten sam model lub inne zmiany w innych modelach nie zostaną zatwierdzone). Jak rozwiązać ten problem?
Modele:
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()
Views:
<?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>
myślę, że to zachowanie jest spowodowane przez leniwe realizacji przez Odoo do obsługi łańcucha pole obliczane wyzwala zamiast przenoszenia wyzwalacze poprawnie (kolejno na podstawie zależności) po prostu aktualizują KAŻDY wyliczony obszar KAŻDEGO czasu są zmiany DO KAŻDEGO INNEGO POLA. Z tego powodu ograniczają one wszelkie aktualizacje do innych pól z poziomu funkcji obliczeniowej. Bo jeśli tego nie zrobi, będzie wysadzony rekurencyjnym wywołaniem funkcji obliczeniowej.
Andrei, jesteś mężczyzną! Ha ha. Nigdy nie myślałem o korzystaniu z zapytań SQL niskiego poziomu. Powodem, dla którego używam relacji Many2many jest ten problem: http://stackoverflow.com/questions/29962101/is-it-possible-to-make-a-one2many-relation- bez -specyficznych-target-modeli . Dziedziczenie Odoo jest niepodobne do dziedziczenia Java, nie wiem, jak zakodować superklasę z jednym2mnim polem, który może być dziedziczony przez podklasy. Tak więc postanowiłem zamiast tego użyć wiele2 relacji, która działa dobrze, dopóki nie dostałem się do tego problemu. – William
Ale wciąż muszę zmodyfikować twoje rozwiązanie, ponieważ tabela * relacji zmienia się za każdym razem, gdy przedłużam superklasę *! – William
Więc problem jest zupełnie inny :) Odpowiem na inne pytanie. W Dziedziczenie Odoo jest przez delegację - nie używaj dziedziczenia klasy Python, zamiast tego użyj Odoo _inherit = '....'. –