共有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 ='....'。 –