4

在 Openerp 中,我们有 object_A 和一个 one2many 字段属于 object_B。Object_B 有一个浮点字段。在 object_A 中,我们为对应的 object_B 提供了一个 one2many_list 小部件,因此很自然地,每个新记录都会有多行。
我知道这很简单,但我很难在 object_A 中编写一个函数来总结 Object_B 浮点列的总值。我到目前为止是这样的:

def get_result(self, cr, uid, ids):
   total = {}
   for obj in self.browse(cr, uid, ids):
      result=0.0
      total[result]+= obj.o2m_field.float_field
   return total
4

3 回答 3

6

@DReispt 提供的代码应该可以工作,如果您批准答案,请批准他的,而不是我的。

要理解的重要一点是,OpenERP 中的函数字段返回一个字典,其中键的对象 id 和给定对象的字段值作为关联值。

在您的原始代码中:

result = 0.0
total[result] += anything

会导致 aKeyError因为字典最初是空的(total = {}在代码的开头)。

DReispt 代码的较短版本是

def get_result(self, cr, uid, ids, context=None):
   total = {}
   for obj in self.browse(cr, uid, ids, context=context):
      total[obj.id] = sum(o2m.float_field for o2m in obj.o2m_field)
   return total 

这个版本利用了 Python 的生成器表达式,可以传递给sum()内置函数。它也稍微快一些,因为您避免total为每个对象多次访问字典。

于 2012-12-21T07:47:59.523 回答
5

您需要循环 o2m:

def get_result(self, cr, uid, ids, context=None):
   total = {}
   for obj in self.browse(cr, uid, ids, context=context):
      total[obj.id] = 0
      for o2m in obj.o2m_field:
          total[obj.id] += o2m.float_field
   return total 
   #example: {56: 12.34, 57: 56.78}
于 2012-12-20T23:50:36.840 回答
2

Just for kicks, doing it the functional way:

def get_result(self, cr, uid, ids, context=None):
   return {obj.id: sum(o2m.float_field for o2m in obj.o2m_field)
           for obj in self.browse(cr, uid, ids, context=context)}
于 2012-12-21T08:43:43.677 回答