我有一个功能区,但我不知道该功能应该返回什么。
这是我的代码:
功能:
def _property_expense_preset_expenses(self, cr, uid, ids, expenses, arg, context):
spus = self.browse(cr, uid, ids)
_spu = False
for spu in spus:
_spu = spu
if(_spu):
expenses_acc = {}
property_expense_presets = _spu.property_expense_presets
for property_expense_preset in property_expense_presets:
expenses = property_expense_preset.expense_preset.expenses
for expense in expenses:
expenses_acc[expense.id] = expense
return expenses_acc
else:
return {}
字段定义:
'expenses' : fields.function(
_property_expense_preset_expenses,
type='one2many',
obj="property.expense",
method=True,
string='Expenses'
),
上面的代码不起作用,它会引发错误:KeyError: 788
答案 0 :(得分:6)
与所有函数字段一样,它必须返回一个字典,其中包含您在id中传递的每个ID的条目和值,尽管您的值可以是False,None,[]
在您的情况下,您的功能字段被声明为one2many类型,这意味着您的功能字段必须返回一个字典,其中包含每个id的条目和值,一个表示相关表的ID的整数列表,在您的情况下, property.expense。
一种非常常见的模式是:
def _property_expense_preset_expenses(self, cr, uid, ids, field, arg, context = None):
res = {}
for spu in self.browse(cr, uid, ids, context = context):
res[spu.id] = []
for preset in spu.property_expense_presets:
res[spu.id].extend([x.id for x in preset.expense_preset.expenses])
return res
假设ids包含1,2,3,您将获得结果 {1:[...],2:[...],3:[]}
每个列表包含费用的整数ID,如果没有,则列出空列表。
作为一般性评论,我注意到你的代码没有将context参数默认为None,或者将上下文作为命名参数传递给browse方法 - 这两者都很重要。
答案 1 :(得分:1)
在OpenERP功能字段中是一个字段,它将值
计算/逻辑值返回到表。您的价值无法直接获得。 这就是为什么我们要使用功能字段和返回一些值。
当你插入数据进入对象模型功能字段每次调用定义的函数和那个函数逻辑代码时你做了什么并返回功能字段值。
class me.branch(osv.osv):
_name = "me.branch"
_order = 'name'
def _get_branch_name(self, cr, uid, ids, field_name, arg, context=None):
r = {}
for branch in self.browse(cr, uid, ids, context=context):
r[branch.id] = branch.name.split('/')[-1]
return r
_columns = {
'name': fields.char('Name', required=True),
'branch_name': fields.function(_get_branch_name, type='char', string='Branch', readonly=1, store=True),
}
以上示例代码 branch name (eg. saas/demo/rarone )
已存在于 another table
。
但我希望在字符串 branch name
和商店之后只 last slash (/)
(rarone)
仅限 this table
。