0

我已经开始学习在 Python 语言下开发 OpenERP 模块。我一直在网上寻找源代码示例,并尝试自己学习。我已经浏览了 Python 代码,但无法理解 _defaults 和 lambda 的使用。喜欢 :

 _defaults = {
        'name': lambda obj, cr, uid, context: '/',
        'state': 'draft',

    }

请说几句话以了解这两个方面的知识。

希望提出建议

谢谢

4

2 回答 2

2

_default字典用于设置其中给出的字段的默认值。从 UI 创建任何新记录时,默认情况下会显示此值。

lambda:Python 支持在运行时创建匿名函数(即未绑定名称的函数),使用名为“lambda”的构造。这意味着您可以使用函数运行时而无需使用名称定义它,将其所有代码放在一行中。现在,在 OpenERP 中,您可以看到函数具有一些参数,例如 cr(数据库光标)、uid、id 等。使用所有这些,您可以访问数据库(使用 OpenERP 的 ORM 方法)。因此,与其定义一个完整的函数来设置默认值,lambda 函数是一个明智的选择。例如 ,

_defaults = {
    'active': True,
    'type': 'general',
    'company_id': lambda self,cr,uid,c: self.pool.get('res.users').browse(cr, uid, uid, c).company_id.id,
}

在上面的代码中,company_id 可以使用 lambda 设置为默认值,该 lambda 调用类“res.users”的 ORM 的浏览方法来获取登录用户的 id。

你也可以通过定义一个函数来做到这一点,

def _get_default_company(self, cr, uid, context=None):
    company_id = self.pool.get('res.users')._get_company(cr, uid, context=context)
    return company_id        
_defaults = {
    'active': True,
    'type': 'general',
    'company_id': _get_default_company,
}
于 2013-10-10T11:26:30.903 回答
0

@ArsalanSherwani:基本上我们也可以在没有 lambda 的情况下进行赋值,只有在我们想要一些动态或计算值时才应该使用 lambda,但是如果你想分配静态值,你可以直接赋值,因为 _default 只是一个字典。正如你在行函数中知道的 lambda 所以你可以在 dict 中调用外部函数来计算值,这一切都只是 pythonic,没有什么特定于 OpenERP 唯一的特殊之处在于 _defaults 是它设置字段的默认值时您可以尝试创建新记录,即当您单击视图中的创建按钮时,它会调用 _default_get 方法,ORM 中的 default_get 方法将从该块计算值并返回值。因此,您也可以使用 _defulat_Get 更改 _defaults balck 值的行为。

@ArsalanSherwani:在您的代码中

lambda obj, cr, uid, context: '/',

  • obj请参阅SelfObject ,即您当前的类本身。
  • cr: 数据库游标对象在 DB 上执行 SQL 操作 :)
  • uidL 是当前登录的用户。
  • context是 dict 来传递对象之间的上下文值。

这所有参数默认为从osv.osvor派生的任何类方法,osv.Model并且此参数是全局使用的,因此您可以将它们与您想要的方法一起使用。

于 2013-10-10T12:51:17.837 回答