1. 基础字段
class odoo.fields.Field(string=, **kwargs)
(1)基本字段类型
字段类型 | 说明 |
Char(string) | 是一个单行文本,唯一位置参数是string字段标签。 |
Text(string) | 是一个多行文本,唯一位置参数是string字段标签。 |
Selection(selection, string) | 是一个下拉选择列表。选项位置参数是一个 [(‘value’, ‘Title’),] 元组列表。元组第一个元素是存储在数据库中的值,第二个元素是展示在用户界面中的描述。该列表可由其它模块使用selection_add关键字参数扩展。 |
Html(string) | 存储为文本字段,但有针对用户界面 HTML 内容展示的特殊处理。出于安全考虑,该字段会被清洗,但清洗行为可被重载。 |
Integer(string) | 仅需字段标题字符串参数。 |
Float(string, digits) | 带有第二个可选参数digits,该字段是一个指定字段精度的(x,y)元组,x 是数字总长,y 是小数位。 |
Monetary(string, currency_field) | 与浮点字段类似,但带有货币的特殊处理。第二个参数currency_field用于存储所使用货币,默认应传入currency_id字段。 |
Date(string)和Datetime(string) | 字段只需一个字符串文本位置参数。 |
Boolean(string) | 的值为True 或False,可传入一个字符串文本位置参数。 |
Binary(string) | 存储文件类二进制文件,只需一个字符串文本位置参数。它可由Python使用 base64编码字符串进行处理。 |
(2)特殊字段属性
属性 | 说明 |
name | (通常为 Char)默认作为记录的显示名称。通过是一个 Char,但也可以是 Text 或Many2one字段类型。用作显示名的字段可修改为_rec_name模型属性。 |
active | (Boolean型)允许我们关闭记录。带有active=False的记录会自动从查询中排除掉。可在当前上下文中添加{‘active_test’: False} 来关闭这一自动过滤。可用作记录存档或假删除(soft delete)。 |
state | (Selection类型) 表示记录生命周期的基本状态。它允许使用states字段属性来根据记录状态以具备不同的 UI 行为。动态修改视图:字段可在特定记录状态下变为readonly, required或invisible。 |
parent_id和parent_path Integer | (Char型)对于父子层级关系具有特殊意义。本文后续会进行讨论。 |
(3)常用字段属性
属性 | 说明 |
string | 是字段的默认标签,在用户界面中使用。如未传入,ORM获取类中的字段名称大写作为默认名称 |
default | 设置字段默认值。可以是具体值(如 active字段中的default=True),或是可调用引用,有名函数或匿名函数均可。 |
help | 提供 UI 中鼠标悬停字段向用户显示的提示文本 |
readonly | (布尔值,默认为False)readonly=True会使用户界面中的字段默认不可编辑。仅针对用户界面设置。 |
required | (布尔值,默认为False)required=True使得用户界面中字段默认必填 |
index | (布尔值,默认为False)index=True为字段添加数据库索引,让搜索更快速,但同时也会部分降低写操作速度。 |
copy | copy=False让字段在使用 ORM copy()方法复制字段时忽略该字段。除 to-many 关联字段外,其它字段值默认会被复制。 |
groups | groups可限制字段仅对一些组可访问并可见。值为逗号分隔的安全组XML ID列表,如groups=’base.group_user,base.group_system’。 |
states | 传入依赖 state字段值的 UI 属性的字典映射值。可用属性有readonly, required和invisible,如states={‘done’:[(‘readonly’,True)]}。 |
oldname | (string) 该字段的先前名称,以便ORM可以在迁移时自动重命名 |
(4)文本字段(Char, Text和Html)特有属性
属性 | 说明 |
size (Char) | 设置最大允许尺寸。无特殊原因建议不要使用,例如可用于带有最大允许长度的社保账号。 |
translate | 使用的字段内容可翻译,带有针对不同语言的不同值。 |
trim | (默认值为 True),启动在网络客户端中自动去除周围的空格。可通过设置trim=false来取消。 |
(5)示例代码
class Book(models.Model):
...
# String fields
name = fields.Char('Title', required=True)
isbn = fields.Char('ISBN')
book_type = fields.Selection(
[('paper', 'Paperback'),
('hard', 'Hardcover'),
('electronic', 'Electronic'),
('other', 'Other')],
'Type')
notes = fields.Text('Internal Notes')
descr = fields.Html('Description')
# Numeric fields:
copies = fields.Integer(default=1)
avg_rating = fields.Float('Average Rating', (3,2))
price = fields.Monetary('Price', 'currency_id')
currency_id = fields.Many2one('res.currency') # price helper
# Date and time fields
date_published = fields.Date()
last_borrow_date = fields.Datetime(
'Last Borrowed On',
default=lambda self: fields.Datetime.now())
# Other fields
active = fields.Boolean('Active?', default=True)
image = fields.Binary('Cover')
2. 关系字段
当涉及到的不同模型间的数据时,使用关联字段来建立关系。
(1)字段类型
多对一:Many2one(comodel_name, string)
属性 | 说明 |
comodel_name | 关联模型的名称(字符串) |
domain | 在客户端(domain或字符串)上设置候选值的可选域 |
context | 处理该字段时在客户端使用的可选上下文(字典) |
ondelete | 删除关联记录时执行的操作;可选的值是: ‘set null’(置空), ‘restrict’(抛出错误,阻止删除), ‘cascade’(同时删除当前记录和关联记录) |
auto_join | 是否在搜索该字段时生成JOINs(布尔值,默认为False) |
delegate | 将其设置为True可以从当前模型访问目标模型的字段(对应于_inherits) |
string | 字段标签 |
一对多:One2many(comodel_name, inverse_name, string)
属性 | 说明 |
comodel_name | 关联模型的名称(字符串) |
inverse_name | comodel_name中指向Many2one的字段,指向当前记录(字符串) |
domain | 在客户端(domain或字符串)上设置候选值的可选域 |
context | 处理该字段时在客户端使用的可选上下文(字典) |
auto_join | 是否在搜索该字段时生成JOINs(布尔值,默认为False) |
limit | 读取记录时使用的可选限制(整数) |
string | 字段标签 |
多对多:Many2many(comodel_name)
属性 | 说明 |
comodel_name | 关联模型的名称(字符串) |
relation | 存储数据库中关系的表的可选名称(字符串) |
column1 | 关联表中字段名称(字符串) |
column2 | 关联表中字段名称(字符串) |
domain | 在客户端(domain或字符串)上设置候选值的可选域 |
context | 处理该字段时在客户端使用的可选上下文(字典) |
limit | 读取记录时使用的可选限制(整数) |
string | 字段标签 |
(2)操作代码
一对多:One2many
属性 | 说明 |
(0, 0,{ values }) | 根据values里面的信息新建一个记录 |
(1,ID,{values}) | 更新id=ID的记录(对id=ID的执行write 写入values里面的数据) |
(2,ID) | 删除id=ID的数据(调用unlink方法,删除数据以及整个主从数据链接关系) |
多对多:Many2many
属性 | 说明 |
(0,0,{values}) | 根据values里面的信息新建一个记录。 |
(1,ID,{values}) | 更新id=ID的记录(写入values里面的数据) |
(2,ID) | 删除id=ID的数据(调用unlink方法,删除数据以及整个主从数据链接关系) |
(3,ID) | 切断主从数据的链接关系但是不删除这个数据 |
(4,ID) | 为id=ID的数据添加主从链接关系。 |
(5) | 删除所有的从数据的链接关系就是向所有的从数据调用(3,ID) |
(6,0,[IDs]) | 用IDs里面的记录替换原来的记录(就是先执行 (5) 再执行循环IDs执行 (4,ID)) |
(3)示例代码
class Book(models.Model): #书籍
...
#出版商
publisher_id = fields.Many2one(
'res.partner', # 关联模型
string='Publisher')
#作者
author_ids = fields.Many2many(
'res.partner', # 关联模型
string='Author')
class Partner(models.Model): #联系人模型
...
_inherit = 'res.partner'
#出版过的书籍
published_book_ids = fields.One2many(
'library.book', # 关联模型
'publisher_id', # 关联模型中所指向的字段
string='Published Books')
#作者的书籍
book_ids = fields.Many2many(
'library.book',
string='Authored Books')
<field name="users" eval="[(6,0,[ref('base.user_root')])]"/>
3.计算字段
计算字段,提供由函数计算出值的属性。
属性 | 说明 |
compute | 计算字段的方法的名称 |
inverse | 反转字段的方法,并写入(可选) |
search | 在字段上实现搜索的方法的名称(可选) |
store | 字段是否存储在数据库中(布尔值,默认情况下在计算字段上为False) |
compute_sudo | 是否应将该字段重新计算为超级用户以绕过访问权限(布尔值,默认为False) |
related | 通过关联模型的字段可在模型中直接可用,并且可通过点号标记法直接访问 |
class Book(models.Model):
...
#计算字段的写法
publisher_country_id = fields.Many2one(
'res.country', string='Publisher Country',
compute='_compute_publisher_country'
# store = False, # 默认不在数据库中存储
inverse='_inverse_publisher_country',
search='_search_publisher_country',
)
@api.depends('publisher_id.country_id')
def _compute_publisher_country(self):
for book in self:
book.publisher_country_id = book.publisher_id.country_id
def _inverse_publisher_country(self):
for book in self:
book.publisher_id.country_id = book.publisher_country_id
def _search_publisher_country(self, opearator, value):
return [('publisher_id.country_id', operator, value)]
#关联字段的写法
publisher_country_id = fields.Many2one(
'res.country', string='Publisher Country',
related='publisher_id.country_id',
)