字段的公共属性:
Char
字符类型,对应数据库中varchar类型,除了通用类型外接收另外两个参数:
size: 字符长度,超出的长度将被截断
trim: 默认True,是否字段值应该被去空白。
Text
文本类型,对应数据库中的text类型,不限长度,没有额外的参数。
Integer
整数类型, 对应数据库中的int4类型
Float
浮点数类型, 兼容数据库中int4, numberic, float8类型.
Float类型可以使用digits属性来指定小数的精度, 例如:
price = fields.Float("价格", digits=(16,3))
digits这里是一个元组,16代表整个数据的长度, 3代表小数的位数. 另外, digits也可以接收一个用来描述系统精度的文本字符串.例如,系统中预置的精度变量名称Discount, 那么,上述定义也可以写成这个样子*:
price = fields.Float("价格", digits="Discount")
Float类型的字段也可以显示为货币类型,方法是在xml中使用monetary小部件:
<field name="amount_undiscounted" string="Subtotal" widget="monetary"/>
Html
Html类型,用于存储一段HTML代码,对应数据库中的text类型,接收下面几个参数:
- sanitize:是否过滤安全字符(默认True)
- sanitize_tags: 是否过滤的html标签(只接收白名单列表标签,默认True)
- sanitize_attributes: 是否过滤的html属性(只接收白名单列表属性,默认True)
- sanitize_style: 是否过滤style属性(默认False)
- strip_style: 是否去除style属性中的空白(默认False)
- strip_classes:是否去除class属性中的空白(默认False)
Date
日期类型,对应于数据库中的date类型,该字段包括如下几个特有方法:
- today: 当前日期
- context_today: 返回客户端时区的当前时间
- to_date: 将时间值转换为date类型的时间
- to_string: 将时间值转为文本
例如我们想要给某个日期字段设置默认的属性为当天,那么可以像下面这样写:
date_start = fields.Date("开始日期",default=fields.Date.today())
Datetime
时间类型,对应于数据库中的timestamp类型,该字段包括如下几个特有方法:
- now: 当前时间
- today: 当前日期
- context_timestamp: 客户端时区的当前时间戳
- to_datetime:将时间值转换成datetime类型
- to_string: 将时间值转成文本
假如我们想要给某个时间字段设置默认当前时间,那么可以像下面这样写:
date_start = fields.Datetime("开始时间",default=fields.Datetime.now())
Binary
二进制文件类型,接收三个参数:
- prefetch: 默认False
- context_dependent:默认True
- attachment:默认True,是否作为附件存储
二进制文件作为附件存储时存在服务器指定的文件夹路径中,否则存在数据库中,对应的数据库类型为bytea.
图片类型的字段在odoo中亦是使用Binary字段存储的,只不过视图渲染时使用了image部件。
二进制字段通常以base64编码的形式存储在数据库中,因此在展示时,需要将base64进行解码输出。另外,二进制文件在form表单中只读状态下表现为下载按钮,但不包含原始的文件名。如果想要显示文件名,需要使用另外一字段将文件名存储起来。可参考如下代码:
<field name="xls" filename="xls_name"/>
<field name="xls_name" invisible="1"/>
Selection
下拉选择类型,多选一类型,不同于Many2one类型,Selection类型在数据库中对应的类型是int4或varchar类型。
除了通用的属性,另外接收2个参数:
- selection: 可选的范围值,值和名称组成的元组列表。
- validate: 默认True,是否写入时校验。
- Selection包含如下的属性或方法:
Monetary
odoo中对于货币类型的数值单独做了一个字段用来处理,这个字段就是Monetary。Monetary的基本使用方法同Float类型一致,不同的是Monetary的值会更精确,同时Monetary的值还依赖于当前计算环境的币种。
默认情况下要使用Monetary字段,需要在当前模型中同时新增一个currency_id的Many2one的字段,该字段表明本模型使用的货币类型(res.currency)。
例如:
currency_id = fields.Monetary("res.currency","货币")
amount = fields.Monetary("小计")
在视图中,如果需要带上货币符号,我们可以使用monetary小部件:
<field name="amount_total" widget="monetary" options="{'currency_field': 'currency_id'}"/>
如果不想使用默认的currency_id字段,可以在options中传入指定的货币类型字段名。
Many2one
多对一类型,对应于数据库中的类型是int4,相当于数据库主表中的外键。可选的参数如下:
- comodel_name: 被关联的对象
- domain: 过滤条件
- context: 上下文
- ondelete: 删除时的选项,可选set null(本字段设置null),restrict(严格控制,只有先删除本字段才允许删除)和cascade(级联删除本字段关联的所有记录)。
- auto_join: 当字段被搜索时是否自动聚合,默认为False
- delegate: 当设置为True时,关联对象的所有字段将在本字段变得可用。
One2many
一对多类型,返回值是一个关联对象的集合。接收的参数列表如下:
- comodel_name: 关联对象名称
- inverse_name: 在Many2one对象中的字段名 默认为None
- domain: 过滤条件
- context: 上下文
- auto_join: 当字段被搜索时是否自动聚合,默认为False
- limit: 读取的条数限制
- copy: 是否允许拷贝(默认False)
Many2many
多对多关系类型的字段,Many2many的命令字与One2many相同,与One2many类型不同的是, One2many要对关联对象有一个回溯本身对象的inverse_name字段,而Many2many字段并无此限制。
Many2many字段的主要属性参数如下:
- comodel_name:关联对象名
- relation:关系表名
- column1:本对象的关联字段名
- column2:关联对象的关联字段名
- domain: 过滤条件
- context: 上下文
- limit: 读取条数限制