在python中使用_defaults和lambda进行openerp开发的原因是什么?

时间:2013-10-10 10:45:24

标签: python eclipse lambda openerp

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

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

    }

Plz给出几句话来获得关于这两者的一些技巧。

希望提出建议

由于

2 个答案:

答案 0 :(得分: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,
}

在上面的代码中,可以使用lambda将company_id设置为default,该lambda为类'res.users'调用ORM的browse方法以获取登录用户的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,
}

答案 1 :(得分:0)

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

@ArsalanSherwani:在你的代码中

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

  • obj引用Self对象,即您当前的类本身。
  • cr:数据库游标对象,用于对DB执行SQL操作:)
  • uid L是当前用户登录的。
  • context是dict,用于传递对象之间的上下文值。

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