に継承されているsync.test.subject.b
と多くの2つの関係を持つsync.test.subject.a
の3つのクラスがあります。他のフィールドや他のモデルを計算機能の内部から更新するにはどうすればよいですか?
sync.test.subject.b
S chars
フィールドのseparated_chars
フィールドはsync.test.subject.b
の変化によってトリガされる_compute_separated_chars
と呼ばれる計算関数を介して取り込まれます」。
sync.test.subject.c
の役割は、基本的にchars
をname
に設定して、_compute_separated_chars
をトリガーします。
問題は、関数が実行される前にフィールドが既にシステムによって空になっているため、計算関数内からMany2manyフィールド(つまり、sync.test.subject.a
残存レコード)に関連する残存レコードを削除できないため、 idsを取得する。 separated_chars
に関連していない変更は、計算機能の中からシステムによってコミットされないため、sync.test.subject.a
のIDを格納するための一時フィールドを使用することはできません(変更によって、実際には同じモデルまたは他のモデルへの他の変更はコミットされません)。これをどうすれば解決できますか?
モデル:
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()
再生回数:
<?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>
私はこの動作はチェーン計算フィールドを扱うためのOdooによって怠惰な実装に起因していると思う順に基づいて、(正しくトリガを処理するのではなく、トリガー依存関係)彼らはただ更新すべての計算フィールドEVERYTIMEは、他のすべてのフィールドに変更があります。そしてそのために、compute関数の中から他のフィールドへの更新を制限します。なぜなら、そうでなければ、再帰的な計算関数呼び出しで爆発するからです。
Andrei、あなたは男です!ハハ。私は低レベルのSQLクエリを使用することは考えていません。 Many2many関係を使用する理由は、この問題のためです。http://stackoverflow.com/questions/29962101/is-it-possible-to-make-a-one2many-relation-without-specifying-the-target-models 。 Odooの継承はJavaの継承とは異なり、サブクラスによって継承されるone2manyフィールドを持つスーパークラスをどのように記述するのか分かりません。したがって、私はこの問題に遭遇するまで、うまくいく、多くの多くの関係を代わりに使うことに決めました。 – William
しかし、スーパークラスを拡張するたびに*関係テーブルが変わるので、あなたのソリューションを変更する必要があります*! – William
他の問題は完全に別のところです:)私はもう一つの質問に答えます。 Odooの継承では、委譲によってです - Pythonクラスの継承を使用しないで、代わりにOdoo _inherit = '....'を使用してください。 –