Odoo常见字段
odoo中的常用字段,没有其他花哨的操作。
- Char:Char用于字符串
- Text:Text用于多行字符串值
- Html:类似于Text的多选字符串值,但通常用于以HTML格式存储的富文本
- Boolean:Boolean存储布尔值,True/False。
- Integer:Integer字段存储整型值。
- Binary:Binary字段存储二进制文件,例如图像或文档。
Selection
Selection用于选择列表。这是一个包含多个集合(每个集合中包含一个值和一个描述)的列表。所选择的值存储于数据库中,可以是字符串或整数。
Selection可以使用整型的健,但应注意odoo内部将0解释为未设置,不会显示存储值为0的描述。
Selection字段还接收一个函数引用来替代列表作为selection属性。这允许动态生成选项列表。
正常使用示例
state = fields.Selection([("draft", "草稿"), ("to_audit", "待审核"), ("audited", "已审核")], default="draft", string="状态")
动态生成选项列表示例
def gnrt_score(self): score_list = [] for i in range(1, 11): score_list.append((str(i), str(i))) return score_list score = fields.Selection(selection="gnrt_score", string="评分", help="评分应在1-10之间")
Float
Float字段存储浮点型数值。精度可由位数和小数位位数对来定义。
length = fields.Float(string="长度", digits=(8, 3))。# 总长度为8位,小数位占3位
用户可以自定义浮点字段的精度,具体方法可参考我的另一篇博客:odoo之技巧合集一-使用可配置精度的浮点字段
Monetary
Monetary字段可存储某个币种的数量值。
使用示例
currency_id = fields.Many2one("res.currency", string="Currency") retail_price = fields.Monetary(string="Retail Price", currency_field='currency_id') <field name="currency_id" /> <field name="retail_price" />
Reference
引用字段,可以实现让用户自定义要引用的模型和记录。
@api.model # 在模型级别而不是记录集级别上进行操作 def _referencable_models(self): models = self.env['ir.model'].search([]) print("models:", models) return [(x.model, x.name) for x in models] ref_doc_id = fields.Reference(selection='_referencable_models', string="Reference Document")
Date
Date存储日期值。它在数据库中以日期进行存储。ORM中以Python date对象的形式对其进行处理。所使用的格式在odoo.fields.DATE_FORMATE中定义。
Date字段对象的一些非常方便的工具方法:
- fields.Date.to_date(string_value将字符串解析为⼀个date对象。
- fields.Date.to_string(date_value)将Date对象表示为字符串。
- fields.Date.today()以字符串格式返回当前⽇期。这适合⽤于默认值。
- fields.Date.context_today(record, timestamp)根据记录(或记录集)上下⽂的时区以 字符串格式返回时间戳的⽇期(或者在省略时间戳时返回当天)。
Datetime
Datetime字段用于日期时间值。在数据库中以原生UTC时间datetime进行存储。ORM中以Python datetime对象的形式对其进行处理。所使用的格式在odoo.field.DATETIME_FORMATE中定义。
Datetime字段对象的一些非常方便的工具方法:
- fields.Datetime.to_datetime(string_value)将字符串解析为datetime对象。
- fields.Datetime.to_string(datetime_value)将datetime对象表示为字符串。
- fields.Datetime.now()以字符串格式返回当天及当前时间。它适合⽤作默认值。
- fields.Datetime.context_timestamp(record, timestamp)将时间戳原⽣datetime按照记 录上下⽂的时区转化为对应时区。它不适合⽤作默认值,但是在向外部系统发送数据等 操作时可以使⽤。
多对多字段
Many2one
多对一字段,Many-to-one字段向模型的数据表中添加了⼀列,存储关联记录的数据库ID。在数据库级别
上,还会创建外键约束,确保保存的ID是对关联表中记录的有效引⽤ 。对这些关联字段不会 创建数据库索引,但这可通过添加 index=True 属性来进⾏完成。
publisher_id = fields.Many2one("res.partner", string="Publisher", ondelete="set null", context={}, domain=[], index=True)
One2many
一对多字段,One-to-many字段是many-to-one的反向关联,虽然one2many字段像其它字段⼀样添加在模型中,但在数据库中并没有实际的体现。他们仅是编程捷径,启⽤数据库视图来展现这些关联记录列表。
published_book_ids = fields.One2many("library.book", "publisher_id", string="Published Book")
Many2many
多对多字段,Many-to-many关联也不会向模型数据表添加列。这类关联在数据库中使⽤中间关联表进⾏ 体现,其中有两列分别存储这两个关联的ID。
Odoo⾃动处理这⼀关联表的创建。关联表的名称默认使⽤两个关联模型名按字⺟排序加上⼀
个_rel后缀来创建。但我们可以使⽤relation属性来进⾏覆盖。
authored_book_ids = fields.Many2many("library.book", relation="author_book_rel", column1="authored_book_ids",
column2="author_ids", string="authored books")
column1:这是连接这个模型的关联表中的Many2one字段的名称
column2:这是在关联数据表中连接comodel的Many2one字段的名称
Odoo默认添加字段与特殊字段
Odoo默认添加字段
有些字段在odoo模型中默认添加,因此我们不应在字段中使用这些名称。这些是记录自动生成的标识符的id字段以及一些审计日志字段,如下所示:
- create_date是记录创建的时间戳
- create_uid是创建该记录的⽤户
- write_date是最近记录的编辑时间戳
- write_uid是最后编辑记录的⽤户
这些⽇志字段的⾃动创建可通过设置模型属性_log_access=False来进⾏禁⽤。
特殊字段:active
它应是布尔型字段,允许⽤将记录标记为⾮活跃 (inactive)。它的定义如下:
active = fields.Boolean('Active', default=True)
默认只有将active设置为True的记录才可⻅。要获取隐藏字段,我们需要使⽤域过滤器[(‘activ e’, ‘=’, False)]。⽽如果向环境上下⽂添加了’active_test’: False 值,ORM则不会过滤掉⾮活跃记录。
在有些情况下,你可能不能修改上下⽂来获取活跃及⾮活跃记录。这时,可以使⽤ [‘|’, (‘active’, ‘=’, True), (‘active’, ‘=’, False)] 域。 注意:[(‘active’, ‘in’ (True, False))]可能不会如你所预期那样。Odoo在域中显式地查找(‘active’, ‘=’, False)语句。它默认会限制仅搜索活跃记录。