我在 OpenERP 中有两个未存储在数据库中的功能字段。事实上,它们在数据库中没有列。它们是从其他表中即时计算的。我希望能够计算它们的总和或差异。我在这里看到了一些东西(计算字段的总和),但我认为它会去数据库获取数据。请问我怎样才能做到这一点。将数据存储在数据库中并从那里提取数据的最佳选择是什么?
问问题
3271 次
2 回答
4
它们可以是替代解决方案,例如定义第三个计算字段并使用“multi=''”并计算差异,您可以将第三个字段保存在 db 中,或者如果您需要稍后的外部使用,您可以使其保持动态。
此处的优势将是在计算第三个字段的 2 个字段存储差异之后。
示例代码片段如下:
class code_play(osv.osv):
_name = 'code.play'
def _calc_function(self, cr, uid, ids, fields_list, args, context=None):
vals = {}
for id in ids:
fields = {}
for field in fields_list:
fields[field] = 10
fields["calc3"] = fields['calc1'] + fields['calc2']
vals[id] = fields
return vals
_columns = {
'name': fields.char('Name', required=True, size=50),
'calc1': fields.function(_calc_function, type='integer', store=False, multi="compute_person_data"),
'calc2': fields.function(_calc_function, type='integer', store=False, multi="compute_person_data"),
'calc3': fields.function(_calc_function, type='integer', store=False, multi="compute_person_data"),
}
正如我再次解释的那样,将计算带有 multi 的字段,但函数相同,因此返回类型将是
# when called with ``ids=[1,2,3]``, ``compute_person_data`` could return:
{
1: {'calc1': 10, 'calc2': 10, 'calc3': 20},
2: {'calc1': 10, 'calc2': 10, 'calc3': 20},
3: {'calc1': 10, 'calc2': 10, 'calc3': 20}
}
问候
于 2012-05-15T11:10:49.977 回答
4
您可以将函数字段与 multi 关键字组合并在一个函数中计算它们,然后添加第三个函数字段会很容易。
class your_class(osv.osv):
_inherit = 'whatever'
def calc_fields(self, cr, uid, ids, fields, arg, context=None):
res = {}
for record in self.browse(cr, uid, ids, context=context):
res[record.id] = {
'field1': 5, # Calculate the field values here
'field2': 3,
'field3': 5+3,
}
return res
_columns = {
'field1': fields.function(calc_fields, multi='my_combination', string='Field 1'),
'field2': fields.function(calc_fields, multi='my_combination', string='Field 2'),
'field3': fields.function(calc_fields, multi='my_combination', string='Field 1 + Field 2'),
}
your_class()
请记住,此示例已简化并且缺少函数字段的“type”关键字,只是为了保持此示例干净并指出“multi”关键字的重要性
于 2012-05-15T11:15:58.907 回答