多次调用计算方法?
Compute method is called multiple times?
I found out that this probably isn't concurrency problem as the
method is recalled JUST WHEN I TRY TO UPDATE THE sync.test.subject.b
's separated_chars
FIELD (at the end of the method). So
I can't solve this with thread locking as the method actually waits for itself to be called again. I don't get it this is a totally bizarre behavior.
我在更新计算字段时发现了一个奇怪的行为。在这种情况下代码比文字更好:
型号:
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.depends('chars')
def _compute_separated_chars(self):
print "CHAR SEPARATION BEGIN"
sync_test_subject_a_pool = self.env['sync.test.subject.a']
print "SEPARATE CHARS"
# SEPARATE CHARS
characters = []
if self.chars:
for character in self.chars:
characters.append(character)
print "DELETE CURRENT CHARS"
# DELETE CURRENT MANY2MANY LINK
self.separated_chars.unlink()
print "DELETE EXISTING sync_test_subject_a THAT ARE RELATED TO CURRENT SELF"
# DELETE EXISTING sync_test_subject_a THAT ARE RELATED TO CURRENT SELF
deleted_separated_char_ids = []
for separated_char in self.separated_chars:
deleted_separated_char_ids.append(separated_char.sync_test_subject_a_id.id)
sync_test_subject_a_pool.browse(deleted_separated_char_ids).unlink()
print "INSERT NEW CHAR RECORDS"
#INSERT NEW CHAR RECORDS
separated_char_ids = []
for character in characters:
separated_char_ids.append(sync_test_subject_a_pool.create({'name':character}).id)
print "UPDATE self.separated_chars WITH CHAR IDS"
#UPDATE self.separated_chars WITH CHAR IDS
self.separated_chars = separated_char_ids
print "CHAR SEPARATION END"
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>
有3个类,sync.test.subject.a
与sync.test.subject.b
有many2many关系,被sync.test.subject.c
继承。
sync.test.subject.b
的 separated_chars
字段通过名为 _compute_separated_chars
的计算函数填充,该函数由 sync.test.subject.b
的 chars
字段的更改触发.
sync.test.subject.c
的作用基本上就是通过自己name
设置chars
,从而触发_compute_separated_chars
"bug" 是通过这样做触发的:
- 创建一个新的
sync.test.subject.c
输入任何名称,例如 ABCDEFG
- 保存新的
sync.test.subject.c
- 按
Set Name To Chars
按钮呼叫 action_set_char
您会看到该函数被触发了两次。
执行结果如下:
CHAR SEPARATION BEGIN
SEPARATE CHARS
DELETE CURRENT CHARS
DELETE EXISTING sync_test_subject_a THAT ARE RELATED TO CURRENT SELF
INSERT NEW CHAR RECORDS
UPDATE self.separated_chars WITH CHAR IDS
CHAR SEPARATION BEGIN
SEPARATE CHARS
DELETE CURRENT CHARS
DELETE EXISTING sync_test_subject_a THAT ARE RELATED TO CURRENT SELF
INSERT NEW CHAR RECORDS
UPDATE self.separated_chars WITH CHAR IDS
CHAR SEPARATION END
CHAR SEPARATION END
结果,原本应该 A,B,C,D,E,F,G
的记录加倍成了 A,B,C,D,E,F,G,A,B,C,D,E,F,G
。这是一个非常危险的行为,因为这会导致数据崩溃。
这是关于如何发生的详细分步布局(基于打印输出):
M1 = first call to the method
M2 = second call to the method
For example in this case
chars = ABCDEFG > trigger the method
M1 - CHAR SEPARATION BEGIN
M1 - SEPARATE CHARS
M1 tries to separate the chars into list [A,B,C,D,E,F,G]
M1 - DELETE CURRENT CHARS
This is needed to REPLACE current character records with the new ones.
since the `separated_chars` is currently empty nothing will be deleted
M1 - DELETE EXISTING sync_test_subject_a THAT ARE RELATED TO CURRENT SELF
The method will try to get all of the `sync.test.subject.a` ids that is related
to self by getting them from `separated_chars` so that they can be unlinked
(This happens before M1 - DELETE CURRENT CHARS).
Since nothing has been added to the `separated_chars`, this will not do anything
M1 - INSERT NEW CHAR RECORDS
Adding [A,B,C,D,E,F,G] `to sync.test.subject.a`, so `sync.test.subject.a` will have
[A,B,C,D,E,F,G]
M1 - UPDATE self.separated_chars WITH CHAR IDS
CURRENTLY THIS IS NOT YET EXECUTED, so no `sync.test.subject.a` ids has been assigned
to self. it will wait till M2 finish executing.
M2 - CHAR SEPARATION BEGIN
M2 - SEPARATE CHARS
M1 tries to separate the chars into list [A,B,C,D,E,F,G]
M2 - DELETE CURRENT CHARS
Because the `separated_chars` IS STILL EMPTY nothing happens.
M2 - DELETE EXISTING sync_test_subject_a THAT ARE RELATED TO CURRENT SELF
See, currently the `separated_chars` field IS STILL EMPTY THOUGH the
`sync.test.subject.a` is filled with [A,B,C,D,E,F,G] the method can't
get the ids because the `separated_chars` is empty.
M2 - INSERT NEW CHAR RECORDS
Now the method adds [A,B,C,D,E,F,G] `to sync.test.subject.a`, so
`sync.test.subject.a` will have [A,B,C,D,E,F,G,A,B,C,D,E,F,G]
M2 - UPDATE self.separated_chars WITH CHAR IDS
This will link `sync.test.subject.a` ids to self so now self has
[A,B,C,D,E,F,G]
M2 - CHAR SEPARATION END
Now after this M1 will continue linking the `sync.test.subject.a` ids to self
that means self will now have [A,B,C,D,E,F,G,A,B,C,D,E,F,G]
M1 - CHAR SEPARATION END
See the problem isn't how many times the method is executed but it's how the method calls itself when it tries to update the field. Which is nonsense.
问题:
- 为什么
_compute_separated_chars
在
同一时刻?
_compute_separated_chars
的触发器应该是
更新 chars
而 chars
只更新一次,为什么
方法被调用了两次?
源文件:Source
这种行为实际上是由于每次尝试更新 separated_chars
字段时方法再次调用自身引起的。导致此行为的原因未知,因为该方法的触发器是此行代码中指定的 chars
字段的更改:@api.depends('chars')
。
我在更新 separated_chars
字段之前用一个设置为 True 的锁定字段(布尔值)对其进行了脏修补,这样当再次调用 _compute_separated_chars
时它不会做任何事情。
代码:
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')
lock = fields.Boolean('Lock')
@api.depends('chars')
def _compute_separated_chars(self):
if not self.lock:
print "CHAR SEPARATION BEGIN"
sync_test_subject_a_pool = self.env['sync.test.subject.a']
print "SEPARATE CHARS"
# SEPARATE CHARS
characters = []
if self.chars:
for character in self.chars:
characters.append(character)
print "DELETE CURRENT CHARS"
# DELETE CURRENT MANY2MANY LINK
self.separated_chars.unlink()
print "DELETE EXISTING sync_test_subject_a THAT ARE RELATED TO CURRENT SELF"
# DELETE EXISTING sync_test_subject_a THAT ARE RELATED TO CURRENT SELF
deleted_separated_char_ids = []
for separated_char in self.separated_chars:
deleted_separated_char_ids.append(separated_char.sync_test_subject_a_id.id)
sync_test_subject_a_pool.browse(deleted_separated_char_ids).unlink()
print "INSERT NEW CHAR RECORDS"
#INSERT NEW CHAR RECORDS
separated_char_ids = []
for character in characters:
separated_char_ids.append(sync_test_subject_a_pool.create({'name':character}).id)
self.lock = True
print "UPDATE self.separated_chars WITH CHAR IDS"
#UPDATE self.separated_chars WITH CHAR IDS
self.separated_chars = separated_char_ids
self.lock = False
print "CHAR SEPARATION END"
sync_test_subject_b()
如果有人知道更好的解决方案,请随时在此线程中 post。
我认为你的问题出在别处。不要介意 Odoo 多少次调用您的 _compute_separated_chars
方法,您必须 return 正确地 separated_chars
字段的值。我的问题在哪里?
separated_chars
字段的值是在您的 _compute_separated_chars
方法中计算的。所以,在调用这个方法的时候,这个字段的值为undefined!你不能依赖它。但是你这样做了——你使用这个值来删除现有的记录。
如果你进一步调试,你会发现执行该方法时,separated_chars
的值可能为空。这样你什么都不删除。如果您计算数据库中的行数 table sync_test_subject_a
,您可能会发现它们随着每次执行 _compute... 方法而增加。
尝试为您的多对多关系字段计算阐述一些不同的逻辑。
以后我会为您提供更清晰的方法版本,但您的问题仍然存在。 separated_chars 没有取消链接,因为在调用时 self.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()
for character in self.chars:
self.separated_chars += \
a_model.create({'name': character})
好吧,总结一下。这个问题已经到了死胡同。如果不编辑 Odoo 的源代码,我无法做任何其他事情来解决这个问题。
Odoo所做的无理取闹如下:
- 系统奇怪地再次从
方法本身,如果您将 id 分配给计算字段(通过
方式)。 (请参阅 Andrei 的回答以获取不会触发此问题的分配 many2many 值的替代方法)
- 系统限制对任何其他字段或模型的任何更改,除了
计算方法中与计算方法相关的字段。
- 每次有变化时系统都会更新计算字段
到任何其他领域(甚至那些与
计算字段)。
Andrei Boyanov 对该方法的替代实施解决了我的一些问题。但还有一个问题,我将问题移至 。
I found out that this probably isn't concurrency problem as the method is recalled JUST WHEN I TRY TO UPDATE THE
sync.test.subject.b
'sseparated_chars
FIELD (at the end of the method). So I can't solve this with thread locking as the method actually waits for itself to be called again. I don't get it this is a totally bizarre behavior.
我在更新计算字段时发现了一个奇怪的行为。在这种情况下代码比文字更好:
型号:
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.depends('chars')
def _compute_separated_chars(self):
print "CHAR SEPARATION BEGIN"
sync_test_subject_a_pool = self.env['sync.test.subject.a']
print "SEPARATE CHARS"
# SEPARATE CHARS
characters = []
if self.chars:
for character in self.chars:
characters.append(character)
print "DELETE CURRENT CHARS"
# DELETE CURRENT MANY2MANY LINK
self.separated_chars.unlink()
print "DELETE EXISTING sync_test_subject_a THAT ARE RELATED TO CURRENT SELF"
# DELETE EXISTING sync_test_subject_a THAT ARE RELATED TO CURRENT SELF
deleted_separated_char_ids = []
for separated_char in self.separated_chars:
deleted_separated_char_ids.append(separated_char.sync_test_subject_a_id.id)
sync_test_subject_a_pool.browse(deleted_separated_char_ids).unlink()
print "INSERT NEW CHAR RECORDS"
#INSERT NEW CHAR RECORDS
separated_char_ids = []
for character in characters:
separated_char_ids.append(sync_test_subject_a_pool.create({'name':character}).id)
print "UPDATE self.separated_chars WITH CHAR IDS"
#UPDATE self.separated_chars WITH CHAR IDS
self.separated_chars = separated_char_ids
print "CHAR SEPARATION END"
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>
有3个类,sync.test.subject.a
与sync.test.subject.b
有many2many关系,被sync.test.subject.c
继承。
sync.test.subject.b
的 separated_chars
字段通过名为 _compute_separated_chars
的计算函数填充,该函数由 sync.test.subject.b
的 chars
字段的更改触发.
sync.test.subject.c
的作用基本上就是通过自己name
设置chars
,从而触发_compute_separated_chars
"bug" 是通过这样做触发的:
- 创建一个新的
sync.test.subject.c
输入任何名称,例如ABCDEFG
- 保存新的
sync.test.subject.c
- 按
Set Name To Chars
按钮呼叫action_set_char
您会看到该函数被触发了两次。
执行结果如下:
CHAR SEPARATION BEGIN
SEPARATE CHARS
DELETE CURRENT CHARS
DELETE EXISTING sync_test_subject_a THAT ARE RELATED TO CURRENT SELF
INSERT NEW CHAR RECORDS
UPDATE self.separated_chars WITH CHAR IDS
CHAR SEPARATION BEGIN
SEPARATE CHARS
DELETE CURRENT CHARS
DELETE EXISTING sync_test_subject_a THAT ARE RELATED TO CURRENT SELF
INSERT NEW CHAR RECORDS
UPDATE self.separated_chars WITH CHAR IDS
CHAR SEPARATION END
CHAR SEPARATION END
结果,原本应该 A,B,C,D,E,F,G
的记录加倍成了 A,B,C,D,E,F,G,A,B,C,D,E,F,G
。这是一个非常危险的行为,因为这会导致数据崩溃。
这是关于如何发生的详细分步布局(基于打印输出):
M1 = first call to the method
M2 = second call to the method
For example in this case
chars = ABCDEFG > trigger the method
M1 - CHAR SEPARATION BEGIN
M1 - SEPARATE CHARS
M1 tries to separate the chars into list [A,B,C,D,E,F,G]
M1 - DELETE CURRENT CHARS
This is needed to REPLACE current character records with the new ones.
since the `separated_chars` is currently empty nothing will be deleted
M1 - DELETE EXISTING sync_test_subject_a THAT ARE RELATED TO CURRENT SELF
The method will try to get all of the `sync.test.subject.a` ids that is related
to self by getting them from `separated_chars` so that they can be unlinked
(This happens before M1 - DELETE CURRENT CHARS).
Since nothing has been added to the `separated_chars`, this will not do anything
M1 - INSERT NEW CHAR RECORDS
Adding [A,B,C,D,E,F,G] `to sync.test.subject.a`, so `sync.test.subject.a` will have
[A,B,C,D,E,F,G]
M1 - UPDATE self.separated_chars WITH CHAR IDS
CURRENTLY THIS IS NOT YET EXECUTED, so no `sync.test.subject.a` ids has been assigned
to self. it will wait till M2 finish executing.
M2 - CHAR SEPARATION BEGIN
M2 - SEPARATE CHARS
M1 tries to separate the chars into list [A,B,C,D,E,F,G]
M2 - DELETE CURRENT CHARS
Because the `separated_chars` IS STILL EMPTY nothing happens.
M2 - DELETE EXISTING sync_test_subject_a THAT ARE RELATED TO CURRENT SELF
See, currently the `separated_chars` field IS STILL EMPTY THOUGH the
`sync.test.subject.a` is filled with [A,B,C,D,E,F,G] the method can't
get the ids because the `separated_chars` is empty.
M2 - INSERT NEW CHAR RECORDS
Now the method adds [A,B,C,D,E,F,G] `to sync.test.subject.a`, so
`sync.test.subject.a` will have [A,B,C,D,E,F,G,A,B,C,D,E,F,G]
M2 - UPDATE self.separated_chars WITH CHAR IDS
This will link `sync.test.subject.a` ids to self so now self has
[A,B,C,D,E,F,G]
M2 - CHAR SEPARATION END
Now after this M1 will continue linking the `sync.test.subject.a` ids to self
that means self will now have [A,B,C,D,E,F,G,A,B,C,D,E,F,G]
M1 - CHAR SEPARATION END
See the problem isn't how many times the method is executed but it's how the method calls itself when it tries to update the field. Which is nonsense.
问题:
- 为什么
_compute_separated_chars
在 同一时刻? _compute_separated_chars
的触发器应该是 更新chars
而chars
只更新一次,为什么 方法被调用了两次?
源文件:Source
这种行为实际上是由于每次尝试更新 separated_chars
字段时方法再次调用自身引起的。导致此行为的原因未知,因为该方法的触发器是此行代码中指定的 chars
字段的更改:@api.depends('chars')
。
我在更新 separated_chars
字段之前用一个设置为 True 的锁定字段(布尔值)对其进行了脏修补,这样当再次调用 _compute_separated_chars
时它不会做任何事情。
代码:
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')
lock = fields.Boolean('Lock')
@api.depends('chars')
def _compute_separated_chars(self):
if not self.lock:
print "CHAR SEPARATION BEGIN"
sync_test_subject_a_pool = self.env['sync.test.subject.a']
print "SEPARATE CHARS"
# SEPARATE CHARS
characters = []
if self.chars:
for character in self.chars:
characters.append(character)
print "DELETE CURRENT CHARS"
# DELETE CURRENT MANY2MANY LINK
self.separated_chars.unlink()
print "DELETE EXISTING sync_test_subject_a THAT ARE RELATED TO CURRENT SELF"
# DELETE EXISTING sync_test_subject_a THAT ARE RELATED TO CURRENT SELF
deleted_separated_char_ids = []
for separated_char in self.separated_chars:
deleted_separated_char_ids.append(separated_char.sync_test_subject_a_id.id)
sync_test_subject_a_pool.browse(deleted_separated_char_ids).unlink()
print "INSERT NEW CHAR RECORDS"
#INSERT NEW CHAR RECORDS
separated_char_ids = []
for character in characters:
separated_char_ids.append(sync_test_subject_a_pool.create({'name':character}).id)
self.lock = True
print "UPDATE self.separated_chars WITH CHAR IDS"
#UPDATE self.separated_chars WITH CHAR IDS
self.separated_chars = separated_char_ids
self.lock = False
print "CHAR SEPARATION END"
sync_test_subject_b()
如果有人知道更好的解决方案,请随时在此线程中 post。
我认为你的问题出在别处。不要介意 Odoo 多少次调用您的 _compute_separated_chars
方法,您必须 return 正确地 separated_chars
字段的值。我的问题在哪里?
separated_chars
字段的值是在您的 _compute_separated_chars
方法中计算的。所以,在调用这个方法的时候,这个字段的值为undefined!你不能依赖它。但是你这样做了——你使用这个值来删除现有的记录。
如果你进一步调试,你会发现执行该方法时,separated_chars
的值可能为空。这样你什么都不删除。如果您计算数据库中的行数 table sync_test_subject_a
,您可能会发现它们随着每次执行 _compute... 方法而增加。
尝试为您的多对多关系字段计算阐述一些不同的逻辑。
以后我会为您提供更清晰的方法版本,但您的问题仍然存在。 separated_chars 没有取消链接,因为在调用时 self.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()
for character in self.chars:
self.separated_chars += \
a_model.create({'name': character})
好吧,总结一下。这个问题已经到了死胡同。如果不编辑 Odoo 的源代码,我无法做任何其他事情来解决这个问题。
Odoo所做的无理取闹如下:
- 系统奇怪地再次从 方法本身,如果您将 id 分配给计算字段(通过 方式)。 (请参阅 Andrei 的回答以获取不会触发此问题的分配 many2many 值的替代方法)
- 系统限制对任何其他字段或模型的任何更改,除了 计算方法中与计算方法相关的字段。
- 每次有变化时系统都会更新计算字段 到任何其他领域(甚至那些与 计算字段)。
Andrei Boyanov 对该方法的替代实施解决了我的一些问题。但还有一个问题,我将问题移至