Odoo:计算字段,在某些情况下不更新?

时间:2016-05-23 10:46:36

标签: python python-2.7 openerp odoo-8

我有一个计算字段,必须在更新字段时更新。 所以我使用@api.depends('field1')并链接函数

field_to_compute: fields.integer(compute='the_function' store=True)

工作正常。

但是我知道我希望在field1取值A时更新它,并在field1取值B时保持不变。但field_to_compute的旧值是从数据库导入的,并未计算。

所以我有两个问题:

  • 如何让用户自己设置值。 (我可以修改它, 但是当我创建一个新成员时,它将被计算并且仅在之后 第一次保存,我可以在UI中修改它)
  • 我怎样才能做出类似的事情:

    @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个字段:gradestatus,分别是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;拒绝",给出其他文本,并保持与他实际相同的等级。

5 个答案:

答案 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')。

看看official docs

答案 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')”,重新加载表单将作为触发器功能的执行。但缺点是,我们无法从这个特定的字段中搜索数据。