在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
答案 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)}