我对函数字段值返回什么?

时间:2014-05-07 09:29:33

标签: openerp openerp-7

我有一个功能区,但我不知道该功能应该返回什么。

这是我的代码:

功能:

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

2 个答案:

答案 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