Odoo 字段类型及常用属性详解
在Odoo中,字段是定义模型结构的基本单元。了解不同类型的字段及其常用属性对于开发和定制Odoo应用程序至关重要。以下是一些常用的字段类型及其属性的详细介绍。
一:基本字段类型
-
Binary
- 用于保存图片、视频、文件、附件等,在视图层显示为一个文件上传按钮。
- 容量限制:最多能容纳20MB内容。
attachment = fields.Binary(string="附件")
-
Char
- 字符型,
size
属性定义字符串长度。name = fields.Char(string="名称", size=100)
- 字符型,
-
Boolean
- 布尔型。
is_active = fields.Boolean(string="是否激活")
- 布尔型。
-
Float
- 浮点型,
digits
定义数字总长和小数部分的位数。rate = fields.Float('Relative Change rate', digits=(12, 6))
- 浮点型,
-
Integer
- 整型。
age = fields.Integer(string="年龄")
- 整型。
-
Date
- 短日期,年月日,在视图层以日历选择框显示。
birth_date = fields.Date(string="出生日期")
- 短日期,年月日,在视图层以日历选择框显示。
-
Datetime
- 时间戳。
created_at = fields.Datetime(string="创建时间")
- 时间戳。
-
Text
- 文本型,多用于多行文本框,可以用
widget
属性为它添加样式。description = fields.Text(string="描述", widget="textarea")
- 文本型,多用于多行文本框,可以用
-
Html
- 与
Text
类似,用于多行文本编辑,自带编辑器样式,并且会把内容以HTML解析。content = fields.Html(string="内容")
- 与
-
Selection
- 下拉列表,枚举类型。
status = fields.Selection([ ('draft', '草稿'), ('confirmed', '已确认'), ('done', '完成') ], string="状态", default='draft')
- 下拉列表,枚举类型。
二:关联字段类型
-
One2one (一对一关系)
- 格式为:
fields.One2one(关联对象Name, 字段显示名, ... )
。 - 在V5.0以后的版本中不建议使用,而是用
many2one
替代。partner_id = fields.One2one('res.partner', string='合作伙伴')
- 格式为:
-
Many2one (多对一关系)
- 格式为:
fields.Many2one(关联对象Name, 字段显示名, ... )
。 - 可选参数有:
ondelete
:当所引用的数据被删除时采取的操作,取值:'set null'
,'restrict'
,'cascade'
。auto_join
:在搜索该字段时是否自动生成JOIN条件,默认False
。delegate
:设置为True
时可以通过当前model访问目标model的字段,与_inherits
功能相同。
category_id = fields.Many2one('product.category', string='类别', ondelete='set null')
- 格式为:
-
One2many (一对多关系)
- 格式为:
fields.One2many(关联对象Name, 关联字段, 字段显示名, ... )
。 - 参数列表:
comodel_name
:目标模型名称。inverse_name
:在comodel_name
中对应的Many2one
字段。limit
:在读取时限制数量。
line_ids = fields.One2many('sale.order.line', 'order_id', string='订单行')
- 格式为:
-
Many2many (多对多关系)
- 格式为:
fields.Many2many(关联对象Name, 关联表, column1, column2, 字段显示名, ... )
。 - 参数列表:
comodel_name
:目标模型名称。relation
:关联的model在数据库存储的表名。column1
:与relation
表记录相关联的列名。column2
:与relation
表记录相关联的列名。limit
:在读取时限制数量。
tag_ids = fields.Many2many('res.partner.category', 'res_partner_category_rel', 'partner_id', 'category_id', string='标签')
- 格式为:
三:引用类型
-
Related 字段
- 通过当前模型的某个关联类型字段的某个字段带出值。
partner_name = fields.Char(related='partner_id.name', store=True)
- 通过当前模型的某个关联类型字段的某个字段带出值。
-
Reference 字段
- 比
related
更高级的引用字段,可以指定该字段引用哪些模型范围内的模型的哪些字段的值,范围更广。ref_model = fields.Reference(selection=[('res.partner', 'Partner'), ('product.product', 'Product')], string='引用')
- 比
四:Odoo保留字段
-
name (Char)
_rec_name
的默认值,在需要用来展示的时候使用。name = fields.Char(string="名称")
-
active (Boolean)
- 设置记录的全局可见性,当值为
False
时通过search
和list
获取不到。active = fields.Boolean(string="激活", default=True)
- 设置记录的全局可见性,当值为
-
sequence (Integer)
- 可修改的排序,可以在列表视图里通过拖拽进行排序。
sequence = fields.Integer(string="顺序")
- 可修改的排序,可以在列表视图里通过拖拽进行排序。
-
state (Selection)
- 对象的生命周期阶段,通过
fields
的states
属性使用。state = fields.Selection([ ('draft', '草稿'), ('confirmed', '已确认'), ('done', '完成') ], string="状态", default='draft')
- 对象的生命周期阶段,通过
-
parent_id (Many2one)
- 用来对树形结构的记录排序,并激活domain表达式的
child_of
运算符。parent_id = fields.Many2one('res.partner', string='父级')
- 用来对树形结构的记录排序,并激活domain表达式的
-
parent_left, parent_right
- 与
_parent_store
结合使用,提供更好的树形结构数据读取。_parent_store = True parent_left = fields.Integer(string='Left Parent', index=True) parent_right = fields.Integer(string='Right Parent', index=True)
- 与
五:自动化属性
在模块安装后,模块中的类会自动添加一些属性,这些属性是Odoo自动化添加与修改的。如果不想为model自动添加这些属性,可以在类中通过_auto = False
来关闭自动化属性。
class MyModel(models.Model):
_name = 'my.model'
_auto = False
六:Compute 字段
compute
字段不是一种字段类型,而是指某个字段的值是计算出来的。定义格式如下:
field_name = fields.Type(compute="function_name", store=True)
@api.depends('dependent_field')
def function_name(self):
for record in self:
record.field_name = computed_value
示例:
total_amount = fields.Float(string="总金额", compute="compute_total_amount", store=True)
@api.depends('price', 'quantity')
def compute_total_amount(self):
for record in self:
record.total_amount = record.price * record.quantity
通过这些字段类型和属性的灵活运用,可以构建出功能丰富且高效的Odoo应用程序。希望这些示例和解释对你有所帮助!