关系字段的openerp sum函数

时间:2012-12-20 22:52:18

标签: python function openerp

在Openerp中,我们有object_A,其中一个one2many字段属于object_B。 Object_B有一个浮点字段。在object_A中,我们有一个one2many_list小部件用于相应的object_B,所以我们每条新记录都有多行。
我知道这很简单,但是我很难在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

3 个答案:

答案 0 :(得分:6)

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

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

在您的原始代码中:

result = 0.0
total[result] += anything

会产生KeyError,因为字典最初是空的(代码开头是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字典。

答案 1 :(得分: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}

答案 2 :(得分:2)

只是为了踢,以功能的方式做到:

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)}