第五章 设置默认值
首先,我们先来问一个问题,在odoo中设置默认值有几种方法?他们各有什么异同?
下面我们来看一下这几种方式。
系统内部
我们可以在系统的UI界面上,通过设置默认值的方式对它进行设置。这种方式的问题在于它是级别最低的默认值。
attrs['default'] = attrs.get('default', self._default_company_dependent)
我们从字段属性的定义中可以得出结论,系统在调用默认值的时候字段属性内的默认值会覆盖掉我们在系统中通过UI界面写入数据库的默认值。
字段内的默认值
我们知道可以在字段内的default属性可以给字段设置默认值。通常的写法如下:
name = fields.Char("Name", default="ABC")
default而也可以接一个方法名,由方法返回默认值。
字段内的default属性是在什么时候调用的呢?
我们从字段属性的定义代码中可以看出,字段属性的默认值是在模块进行初始化的时候赋值的。
default_get
default_get方法给我们提供了一种ORM层面上的默认值修改方法,通过这个方法我们可以从编程层面上对静态代码赋值的默认值进行修改。
我们从代码定义上可以得出结论:
default_get是在create方法内部就行调用的。
动作中的默认值设置
最后一种默认值是的设置方式是在动作中,通常的代码如下:
<field name="context">{'default_name':'ABC'}</field>
那么这种方式的设置又是在什么时候发生的呢?
for name in fields_list:
# 1. look up context
key = 'default_' + name
if key in self._context:
defaults[name] = self._context[key]
continue
# 2. look up ir.default
if name in ir_defaults:
defaults[name] = ir_defaults[name]
continue
field = self._fields.get(name)
# 3. look up field.default
if field and field.default:
defaults[name] = field.default(self)
continue
# 4. delegate to parent model
if field and field.inherited:
field = field.related_field
parent_fields[field.model_name].append(field.name)
由此,
- 环境变量的上下文中
- ir_defaults, 也就是模型定义时指定的默认值.
- 字段定义时的默认值
- 继承的父类的默认值