我有一个计算字段,必须在更新字段时更新。
所以我使用@api.depends('field1')
并链接函数
field_to_compute: fields.integer(compute='the_function' store=True)
工作正常。
但是我知道我希望在field1
取值A
时更新它,并在field1
取值B
时保持不变。但field_to_compute
的旧值是从数据库导入的,并未计算。
所以我有两个问题:
我怎样才能做出类似的事情:
@api.depends('field1')
def the_function(self):
value = self.field1
if value == A:
field_to_compute = 123123
elif value == B:
field_to_compute = stored_field_to_compute #field_to_compute
保持与
编辑(示例):
我在当前模型的res.partner中继承res.partner。 我在其中有一个领域:
'model_state': field.char(compute='compute_type', string = 'Demand', store=True, readonly=True)
在继承res.partner的第二个res.partner中,在另一个模块中,我有2个字段:grade
和status
,分别是int和many2one。以相同的方式计算与model_state相同的compute_type。
我也在这个res.partner中,有一个one2many字段:link_ids
所以我的功能是:
@api.depends('link_ids.type', 'link_ids.result')
def compute_type(self):
for record in self:
if self.link_ids:
if self.link_ids.result == 'A':
if self.link_ids.type == 'type1':
record.model_state = 'Mytext'
record.grade = 15
record.state = 1 #this is an id
elif self.link_ids.result == 'B':
record.model_state = 'MySecondText'
record.state = 2 #this is an id
我不会把所有东西都放在一边,因为它就像25个elif(如果等等等,并不是全部都是一样的)所以它就不合适了。我检查了很多时间,如果什么都没有修改record.grade,如果没有做任何事情,在else或dunno,但它只是被清空。
基本上,简化了,如果结果是" OK"我想做点什么。投票。并将州的身份改为"接受",给出一个文本(如标题),并给他一个更好的成绩,如果不是,他有一个国家的身份和#34;拒绝",给出其他文本,并保持与他实际相同的等级。
答案 0 :(得分:3)
自己做一个预取(必须存储field_to_compute):
@api.multi
@api.depends('field_x')
def _compute_field_to_compute(self):
# prefetch
data = {d['id']: d['field_to_compute']
for d in self.read(['field_to_compute'])}
for record in self:
if record.field_x == '123456':
record.field_to_compute = '654321'
else:
record.field_to_compute = data.get(record.id, 'default')
答案 1 :(得分:1)
如果值为B,则不执行任何操作...或更好:仅在需要时设置字段值。类似的东西:
def _compute_foo(self):
for item in self:
if item.other_field != B:
item.foo = 'newvalue'
我认为您的问题在于您没有像计算字段那样设置值(请参阅item.foo = 'newvalue'
)。
答案 2 :(得分:1)
你应该尝试以下,
@api.onchange('field1')
def function(self):
field_value = self.field_to_compute
if self.field1 == A:
field_value = 123123
self.field_to_compute = field_value
答案 3 :(得分:0)
尝试:
@api.onchange('field1')
def function(self)
if value == A:
field_to_compute = 123123
elif value == B:
field_to_compute = stored_field_to_compute #field_to_compute keep the same value as the one stored before
答案 4 :(得分:0)
对于需要在DB表上保存其值的计算字段,我们使用“@ api..depends('field_attributes')”装饰器,当对定义的字段属性进行了更改时,它将触发执行功能。
对于不需要在DB表上保存其值的计算字段,我们不再需要这个“@ api..depends('field_attributes')”,重新加载表单将作为触发器功能的执行。但缺点是,我们无法从这个特定的字段中搜索数据。