我已经开始学习在 Python 语言下开发 OpenERP 模块。我一直在网上寻找源代码示例,并尝试自己学习。我已经浏览了 Python 代码,但无法理解 _defaults 和 lambda 的使用。喜欢 :
_defaults = {
'name': lambda obj, cr, uid, context: '/',
'state': 'draft',
}
请说几句话以了解这两个方面的知识。
希望提出建议
谢谢
_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,
}
@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
请参阅Self
Object ,即您当前的类本身。cr
: 数据库游标对象在 DB 上执行 SQL 操作 :)uid
L 是当前登录的用户。context
是 dict 来传递对象之间的上下文值。这所有参数默认为从osv.osv
or派生的任何类方法,osv.Model
并且此参数是全局使用的,因此您可以将它们与您想要的方法一起使用。