共有3類,sync.test.subject.a
,與sync.test.subject.b
有很多關係,由sync.test.subject.c
繼承。如何從計算函數內部更新其他字段或其他模型?
sync.test.subject.b
小號chars
字段的字段separated_chars
通過稱爲_compute_separated_chars
一個compute函數其通過sync.test.subject.b
的變化觸發填充'。
sync.test.subject.c
的作用基本上是通過自己的name
來設置chars
,使得_compute_separated_chars
被觸發。
問題是我無法刪除與計算函數內部的Many2many字段(即sync.test.subject.a
剩餘記錄)相關的剩餘記錄,因爲在執行該函數之前,該字段已被系統清空,所以我可以'噸得到ids。我甚至無法使用臨時字段來存儲sync.test.subject.a
ID,因爲任何與separated_chars
無關的更改都不會由系統在計算函數內提交(通過任何更改,我的意思是非常任意更改爲來自相同的模型或其他模型的其他更改不會被提交)。我該如何解決這個問題?
型號:
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 EVERYTIME每個其他字段的變化。因爲它們限制了對計算函數內部任何其他字段的更新。因爲如果他們不這樣做,它會被遞歸計算函數調用炸燬。
安德烈,你是男人!哈哈。我從來沒有想過使用低級別的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 ='....'。 –