目录
1.模型
1.1 什么是模型
💡模型(Model)最主要是存储数据记录的,它可以持久化地对数据记录(record)进行存储,直至记录被删除。几乎所有的自定义模块都会继承自models.Model,可以存储数据库中所有开发所需的数据与字段。
每个模型实例都是⼀个“记录集”,即模型记录的有序集合。记录集由browser(),search()或者字段访问之类的⽅法返回。记录没有显⽰表⽰:⼀个记录表现为记录集的⼀条记录。如果要创建⼀个不能实例化的类,_register属性要设置为False
(📋odoo通过orm来实现对数据库的操作,可以通过在odoo中定义模型,然后根据定义的模型来生成数据库中的表,并通过python中操作对象的方式,来进行对数据库的操作,大部分场景下不在需要写SQL语句,提高了数据库操作的效率以及安全性。)
1.2 模型的类型
基本模型 models.Model
对于常规数据库持久化模型。绝大多数Odoo模型中,类都是基于models.Model类的。
这种类型的模型具有永久的数据库持久性:为它们创建数据库表,并且它们的记录被存储,直到被显式删除。
瞬态模型 TransientMode.Model
为临时数据,存储在数据库中,但隔一段时间自动清除,相当于临时表,通常应用于向导。
抽象模型 AbstractModel.Model
不在数据库存储数据,不会在数据库创建表。
抽象模型作为可重用的功能集,利用odoo的继承功能,混入到其他模型中去。通常用于定义接口或者用作报表模型。
💡Odoo模型可通过继承以上之一创建。
1.3 模型的定义
# -*- coding: utf-8 -*-
from odoo import models, fields, api
class LibraryBook(models.Model):
_name = 'library.book' # odoo模型的内部标识符,创建新模型时,必含项。
_description = 'Library Book 图书馆图书管理' # 一个方便用户的模型记录标题。它是可选项、推荐项
_order = 'name desc' # 当浏览模型记录或者显示在列表视图时,设置默认顺序。 升序排列 asc 倒序排列 desc
_rec_name = 'short_name' # 是一个设置用于展示或记录标题的字段
name = fields.Char('Title 图书标题', required=True)
author_ids = fields.Many2one(
'res.partner',
'authored_book_ids',
string='Authors 作者 '
)
short_name = fields.Char('Short Title 图书简洁标题', required=True)
notes = fields.Text('Internal Notes ')
state = fields.Selection(
[('draft', 'Unavailable 未提交'),
('available', 'Available 审核'),
('borrowed', 'Borrowed 允许'),
('lost', 'Lost')],
'State 状态')
# _name 是我们创建odoo模型的内部标识符,创建新模型时,必含项。
# _description 是当用户界面显示模型时,一个方便用户的模型记录标题。它是可选项、推荐项。
# _order :当浏览模型记录或者显示在列表视图时,设置默认顺序。
# by子句,所以它可以是你可以使用的任何东西,尽管它拥有灵活的行为、支持可翻译和多对一的字段名称。
# 为了完整起见,还有更多的属性在后续案例中会使用:
# _order = "字段名 排序方法"
# 例如:_order = "serial_number asc" 以serial_number字段升序展示
# 升序排列 asc 倒序排列 desc
# _rec_name:用来指出引用关联字描述记录的字段,例如多对一关系。
# 使用short_name作为模型的默认展示字段
# 但是这个属性允许我们使用任何其他字段来实现这个目的。
# _table:用来支持模型的数据库表名。通常,它是左自动计算,是下划线取代点的模型名称,
# 但也可以设置特定的表名。
# _inherit :继承。
# _inherits :委托继承。
Odoo中一切都是基于model编程,即使是前端的menu、action、view,都是也都有对应model,和业务数据无异。一个model的创建,然后通过简单的视图配置,那么这个model对应的CRUD基础功能就已经实现,这些都归功于odoo对于model的抽象。
Odoo中的model分为三类AbstractModel、Model、TransientModel,继承关系如下
AbstractModel = BaseModel
class Model(AbstractModel):
_auto = True # automatically create database backend 是否应创建数据库表
_register = False # not visible in ORM registry, meant to be python-inherited only
_abstract = False # not abstract
_transient = False # not transient
class TransientModel(Model):
_auto = True # automatically create database backend
_register = False # not visible in ORM registry, meant to be python-inherited only
_abstract = False # not abstract
_transient = True # transient
@api.autovacuum
def _transient_vacuum(self):
"""Clean the transient records.
This unlinks old records from the transient model tables whenever the
"_transient_max_count" or "_max_age" conditions (if any) are reached.
Actual cleaning will happen only once every "_transient_check_time" calls.
This means this method can be called frequently called (e.g. whenever
a new record is created).
Example with both max_hours and max_count active:
Suppose max_hours = 0.2 (e.g. 12 minutes), max_count = 20, there are 55 rows in the
table, 10 created/changed in the last 5 minutes, an additional 12 created/changed between
5 and 10 minutes ago, the rest created/changed more then 12 minutes ago.
- age based vacuum will leave the 22 rows created/changed in the last 12 minutes
- count based vacuum will wipe out another 12 rows. Not just 2, otherwise each addition
would immediately cause the maximum to be reached again.
- the 10 rows that have been created/changed the last 5 minutes will NOT be deleted
"""
if self._transient_max_hours:
# Age-based expiration
self._transient_clean_rows_older_than(self._transient_max_hours * 60 * 60)
if self._transient_max_count:
# Count-based expiration
self._transient_clean_old_rows(self._transient_max_count)
def _transient_clean_old_rows(self, max_count):
# Check how many rows we have in the table
query = 'SELECT count(*) FROM "{}"'.format(self._table)
self._cr.execute(query)
[count] = self._cr.fetchone()
if count > max_count:
self._transient_clean_rows_older_than(300)
def _transient_clean_rows_older_than(self, seconds):
# Never delete rows used in last 5 minutes
seconds = max(seconds, 300)
query = """
SELECT id FROM "{}"
WHERE COALESCE(write_date, create_date, (now() AT TIME ZONE 'UTC'))::timestamp
< (now() AT TIME ZONE 'UTC') - interval %s
""".format(self._table)
self._cr.execute(query, ["%s seconds" % seconds])
ids = [x[0] for x in self._cr.fetchall()]
self.sudo().browse(ids).unlink()
扩展:深入理解模型
从源码中可以看出AbstractModel是Model和TransientModel的父类。而这个三者的区别也主要在_auto、_register、_abstract、_transient这四个属性上。
其中 _auto 是否应创建数据库表。 如果设置为假覆盖init() 来创建数据库表。自动默认为真的为常态模型和 瞬态模型, 假为抽象模型。要创建没有任何表的模型,请继承抽象模型。
这里的 models 和 Model 的含义是不一样的。前者指的是Odoo的模型对象,也就是我们开发Odoo时所需要用到的.py文件;后者指的是对于列表、字典、自定义类这些可变变量,如果将其作为类变量,则是传引用,即所有对象的类变量公用一个内存地址。这是Python语言的语法所规定的。扩展:模型的属性
- _auto(bool):决定是否创建数据库表(默认值为True)。如果设置为False,则需要重写init()函数来创建表。
- _table = None:当_auto设置成False时,该值为创建的表名;默认情况下会自动生成一个。用来支持模型的数据库表名。通常,它是左自动计算,是下划线取代点的模型名称,但也可以设置特定的表名。
- _sequence=None:用于字段"ID"的SQL序列。
- _register(bool):在ORM注册表中不可见。
- _name : 是我们创建odoo模型的内部标识符,创建新模型时,必含项。
- _description :是当用户界面显示模型时,一个方便用户的模型记录标题。它是可选项、推荐项。
- _order :当浏览模型记录或者显示在列表视图时,设置默认顺序。by子句,所以它可以是你可以使用的任何东西,尽管它拥有灵活的行为、支持翻译和多对一的字段名称。为了完整起见,还有更多的属性在后续案例中会使用:_order = "字段名 排序方法"。例如:_order = "serial_number asc" 以serial_number字段升序展示,升序排列 asc 倒序排列 desc。
- _rec_name:用来指出引用关联字描述记录的字段,例如多对一关系。使用short_name作为模型的默认展示字段但是这个属性允许我们使用任何其他字段来实现这个目的。
_inherit :继承。
_inherits :委托继承。
_check_company_auto(bool):在写入和创建时调用。
_check_company:以确保公司在具有check_company=True作为属性的关系字段上的一致性。
_parent_store(bool)
_abstract(bool):判断模型是否为抽象模型。
_transient(bool):判断模型是否为瞬态模型。
_date_name(=‘date'):用于默认日历视图的字段。
_fold_name(='fold'):确定看板视图中折叠组的字段。
2 字段
2.1 什么是字段
字段也就是模型本身的属性。
理解举例
例如我们定义一个公司,我们应该通过什么去了解它的,或许是公司名字,公司老板,所在位置等等这些”属性“。同样的字段对与模型而言也是如此。
2.2 字段的定义
book_title = fields.Char(string='Title 图书标题', required=True)
💡注意:模型字段定义为模型本身的属性
这意味着我们不能定义一个字段和一个方法具有相同的名称,否则最后一个将默默覆盖前一个。
字段命名:小写字母,下划线命名法,含义清楚完整,尽量不使用缩写。string: 首字母大写(英文)。
2.3字段类型
2.3.1基础字段
Class odoo.fields.Boolean
- 封装一个bool。
is_check = fields.Boolean('是否已验')
Class odoo.fields.Char
- 基本字符串字段,可以限制长度,通常在客户端中显示为单行字符串。
- 参数
- size (int) – 为该字段存储的值的最大大小 (中英文?)
- trim(bool)-说明值是否被修剪(默认情况下,True)。请注意,修剪操作仅由Web客户端应用。
- translate(bool或callable)-启用字段值的翻译;使用translate=True将字段值作为一个整体翻译;
name = fields.Char('名称', size=5)
Class odoo.fields.Float
- 封装浮点数,精度数字由(可选)数字属性给出。
- 参数
- digits (tuple (int, int) or str) ––引用DecimalPrecision记录名称的对(total,decimal)或字符串。当浮点数是与计量单位相关的数量时,重要的是使用正确的工具以正确的精度比较或四舍五入值。
- Float类为此提供了一些静态方法:
- round() 以给定精度四舍五入浮点。is_zero()检查浮点在给定精度下是否等于零。compare()在给定精度下比较两个浮点。
score = fields.Float('得分', digits=(16, 2))
Class odoo.fields.Integer
- 封装一个int。
rec_count = fields.Integer(string='单据数量')
2.3.2 保留字段
一些字段名称保留给自动字段以外的预定义行为。当需要相关字段时,可以在模型上定义它们。
Odoo.fields.name
- Char类型
- _rec_name的默认值,用于在需要代表性“命名”的上下文中显示记录。
name = fields.Char('公司名称')
Odoo.fields.active Boolean类型
- 切换记录的全局可见性,如果active设置为False,则记录在大多数搜索和列表中都是不可见的。
active = fields.Boolean('Active', default=True)
Odoo.fields.state Selection类型
- 对象的生命周期阶段,由字段上的states属性使用。
state = fields.Selection([('draft', '草稿'),('checking', '审批中'),
('done', '完成')])
Odoo.fields.parent_id Many2one类型
- _Parent_name的default_value,用于组织树结构中的记录,并在域中启用child_of和parent_of运算符。
pay_account_id = fields.Many2one('res.company.pay.bank.lines', string='银行账号',
domain="[('res_company_id','=', company_id )]", ondelete="restrict")
Odoo.fields.parent_path Char类型
- 当_parent_store设置为True时,用于存储反映_parent_name树结构的值,并优化搜索域中的运算符child_of和parent_of。为了正确操作,它必须使用index=True声明。
Odoo.fields.company_id Many2one :type: res_company
- Odoo多公司行为的主要字段名称。
- 由:meth:~odoo.models._check_company用于检查多家公司的一致性。定义记录是在公司之间共享(无价值)还是仅供给定公司的用户访问。(再研究)
2.3.3 自动字段
Odoo在所有模型中创建了几个字段。这些字段由系统管理,不应该写入。
如果有用或必要可以查看。
特点:
1:在模型里面,这些字段是系统保留的,作为开发人员不能修改这些字段。
2:在模型数据表中自动创建的字段,特殊需要时可以重写,但保持类型要保持不变。
3:模型中没有写这个字段时候也可以去表单视图等写入(因为是模型自带的字段)
注意事项:这些保留字段的自动创建可通过设置模型属性 _log_access=False 来进行禁用。
字段 | 描述 |
Odoo.fields.id | 记录id (标识符字段) |
Odoo.fields.create_date | 创建记录时的存储,Datetime创建时间 |
Odoo.fields.create_uid | 创建记录的用户 (res.users用户) |
Odoo.fields.write_date | 上次更新记录时的日期时间 |
Odoo.fields.write_uid | 上次更新记录的用户 |
扩展
如果当前记录集的长度为1,则返回其中唯一记录的ID。否则会引发错误。访问日志字段,如果启用了_log_access,这些字段将自动设置和更新。可以禁用它,以避免在表上创建或更新它们无用的字段。默认情况下,_log_access设置为与_auto相同的值。

2.3.4 高级字段
Class odoo.fields.Binary
- 封装二进制内容(例如:文件)
- 参数:attachment (bool) – 该字段应存储为 ir_attachment表(True) 还是存储在模型表的列中(默认:True)。
file = fields.Binary(string='上传文件')
Class odoo.fields.Html
- 封装html代码内容。
- 参数:
- sanitize (bool)-是否必须对值进行sanitize❓默认:True (在研究)
- sanitize_tags(bool)-是否清理标签(仅接受属性的白名单,默认:True)
- sanitize_attributes(bool)-是否清理属性(仅接受属性白名单,默认:True)
- sanitize_style(bool)-是否清理样式属性(默认:false)
- strip_style(bool)-是否删除样式属性(已删除,因此未进行清理,默认:false)
- strip_classes(bool)-是否剥离类属性(默认:false)
overtime_work = fields.Html(string='工作内容')
Class odoo.fields.Image
- 封装图像,扩展二进制。
- 如果图像大小大于像素的最大宽度/最大高度限制,则通过保持宽高比将图像大小调整为极限。
- 参数:
- Max_width(int)-图像的最大宽度(默认:0,无限制)
- Max_height(int)-图像的最大高度(默认值:0,无限制)
- Verify_resolution (bool) – 是否应验证图像分辨率,以确保它不会超过最大图像分辨率(默认值:True)。有关最大图像分辨率,请参阅odoo.tools.image.ImageProcess(默认:45e6)。
- ⚠️注意:
- 如果没有指定max_width/max_height(或设置为0),并且 verify_resolution为False,则根本不会验证字段内容,并且应该使用二进制字段。
certificate_image = fields.Image('证书照片', max_width=128, max_height=128,)
Class odoo.fields.Monetary
- 封装以给定的res_currency表示的浮点。
- 十进制精度和货币符号取自 currency_field 属性。
- 参数:
- currency_field(str)–持有此货币字段res_currency的Many2one字段的名称表示为(默认:'currency_id')
currency_id = fields.Many2one('res.currency', string='币种', tracking=True)
amount = fields.Monetary(string='金额', digits=(16, 2), currency_field='currency_id', tracking=True)
Class odoo.fields.Selection
- 封装了不同值之间的选择。
- 参数:
- selection (list(tuple(str,str))或可调用或str)-指定此字段的可能值。它要么是一对列表(值,标签),要么是模型方法,要么是方法名称。
- Selection_add (list(tuple(str,str))) –在重写字段的情况下提供选择的扩展。这是一个对(值,标签)或单例(值)的列表,其中单例值必须出现在重写的选择中。新值的插入顺序与重写选择和以下列表一致:
选择 = [('a', 'A'), ('b', 'B')]
Selection_add = [('c', 'C'), ('b',)]
> result = [('a', 'A'), ('c', 'C'), ('b', 'B')]
扩展:Ondelete –为任何带有selection_add的重写字段提供回退机制。这是一个将每个选项从 selection_add 映射到后备操作的命令。(在探究)
此回退操作将应用于selection_add选项映射到它的所有记录。
这些操作可以是以下任何一项:
“设置为空”-默认情况下,所有使用此选项的记录的选择值都将设置为False。
级联”-所有使用此选项的记录都将与选项本身一起删除。
“设置默认值”–使用此选项的所有记录都将设置为字段定义的默认值
<callable> - 可调用,其第一个也是唯一的参数将是包含指定选择选项的记录集,用于自定义处理
除相关或扩展字段外,属性选择是强制性的。
state = fields.Selection([('draft', '草稿'), ('confirm', '确认')], string='状态', default='draft')
Class odoo.fields.Text
- 与Char非常相似,但用于更长的内容,没有大小,通常显示为多行文本框。
- 参数:
- translate(bool或callable)-启用字段值的翻译;使用translate=True将字段值作为一个整体翻译;translate也可能是可调用的,以便translate(callback,value)通过使用callback(term)检索术语的翻译来翻译值。
trip_reason = fields.Text(string='出差事由')
Class odoo.fields.Date
- 封装python日期对象。
- 参数:
- 静态 add(value, *args, **kwargs)
- value - 初始日期或日期时间。
- Returns :结果的日期/日期时间。
trip_reason = fields.Text(string='出差事由')
Class odoo.fields.Datetime
- 封装python datetime对象。
- 参数:
- 静态 add(value,*args,**kwargs)
- 返回 value 和 relativedelta 的总和。
- 参数:
- value - 初始日期或日期时间。
- Args - 位置args直接传递给relativedelta。
- Kwargs - 直接传递给relativedelta的关键字args。
- 返回:结果的日期/日期时间。
application_date = fields.Date(string="申请日期", default=fields.Datetime.now, readonly=True)
扩展:时间日期字段扩展知识
Date(time) Fields
日期(时间)字段
Dates和Datetimes是任何业务应用程序中非常重要的领域。滥用它们可能会造成无形但痛苦的错误。
用这些字段所需的知识。
将值分配给“Date/Datetime”(日期/Datetime)字段时,以下选项有效:
日期或日期时间对象。
正确服务器格式的字符串:
日期字段的YYY-MM-DD,
日期时间字段的YYYY-MM-DD HH:MM:SS。错误或无。
日期和日期时间字段类具有尝试转换为兼容类型的帮助方法:
to_date() 将转换为 datetime.date
to_datetime() 将转换为 datetime.datetime。
注意:表示日期和日期时间的字符串可以相互比较,但结果可能不是预期结果,因为日期时间字符串将始终大于日期字符串,因此强烈不鼓励这种做法。
带有日期和日期时间的常见操作,例如添加、减法或获取句点的开始/结束,通过日期和日期时间公开。这些助手也可以通过导入odoo.tools.date_utils获得。
时区:Datetime字段作为时间戳存储,数据库中没有时区列,并存储在UTC时区中。这是故意的,因为它使Odoo数据库独立于托管服务器系统的时区。时区转换完全由客户端管理。
ORM API — Odoo 14.0 documentation
关系字段:
Class odoo.fields.Many2one
- 命名一般为:name_id
- 此类字段的值是大小为0(无记录)或1(单个记录)的记录集。
- 参数:
- Comodel_name (str) – 除相关或扩展字段外,目标模型的名称为必填字段。
- domain - 在客户端(域或字符串)的候选值上设置的可选domain
- Context (dict) – 在处理该字段时在客户端使用的可选上下文
- Ondelete(str)-删除引用的记录时该怎么做;可能的值是:'set null'、'restrict'、'cascade'
- auto_join(bool)-通过该字段搜索时是否生成JOIN(默认:false)
- delegate(bool)-将其设置为True,以便从当前模型访问目标模型的字段(对应于_inherits)
- Check_company(bool)-在_check_company()中标记要验证的字段。根据字段属性添加默认公司域。
数据库存储方式:⚠️字段存对应模型记录id
account_id = fields.Many2one('budget.account', string='預算科目', required=True, tracking=True)
# 追踪参数要基础一个表(?)
Class odoo.fields.One2many
- 命名:name_ids
- 此类字段的值是comodel_name中所有记录的记录集,使得字段inverse_name等于当前记录。
- 参数:
- Comodel_name (str) – 目标模型的名称
- Inverse_name (str) – comodel_name中inverse Many2one字段的名称
- Domain - 在客户端(域或字符串)的候选值上设置的可选域
- Context (dict) – 在处理该字段时在客户端使用的可选上下文
- auto_join(bool)-通过该字段搜索时是否生成JOIN(默认:false)
- limit(int)-读取时使用的可选限制
- ⚠️注意除相关字段或字段扩展外,属性comodel_name和inverse_name是强制性的。
purchase_ids = fields.One2many('purchase.requisition.line', 'purchase_id', string='采购明细')
Class odoo.fields.Many2many
- 命名:name_ids
- 多对多字段;此类字段的值是记录集。
- 参数
- Comodel_name - 除相关或扩展字段外,目标模型(字符串)的名称除外
- relation(str)-在数据库中存储关系的表的可选名称
- Column1 (str) – 引用表关系中“这些”记录的列的可选名称
- Column2 (str) – 引用表关系中“那些”记录的列的可选名称
- ⚠️注意:属性关系,列1和列2是可选的。如果没有给出,名称会自动从模型名称生成,前提是model_name和comodel_name不同!
- 请注意,ORM不接受在具有相同共同模型的给定模型上具有隐式关系参数的几个字段,因为这些字段将使用相同的表。ORM防止两个many字段使用相同的关系参数,除非两个字段都使用相同的模型,共同模型,关系参数是显式的;或至少有一个字段属于_auto = False的模型。
- 参数:
- Domain - 在客户端(域或字符串)的候选值上设置的可选域
- Context (dict) – 在处理该字段时在客户端使用的可选上下文
- Check_company(bool)-在_check_company()中标记要验证的字段。根据字段属性添加默认公司域。
- Limit(int)-读取时使用的可选限制
peer_employee_ids = fields.Many2many('hr.employee', string='同行人', tracking=True)
💡many2one、one2many、many2many字段在数据库中的存储方式区别:
many2one字段是向模型的(主表)数据表中添加了一列,存储关联表的id。
one2many关联不会在数据库中添加额外的字段,但提供了一个访问父级为该记录的所有记录的快捷方式。
many2many字段是存储在辅助表的,辅助表中分别存储了两个关联表的id。
计算字段:
computed fields
必须使用计算参数(而不是直接从数据库读取)。
它会将计算值分配给该字段。如果需要使用其他字段的值,可以使用depends()指定这些字段。
特点:计算字段默认不存库(store=False)
from odoo import api
total = fields.Float(compute='_compute_total')
@api.depends('value', 'tax')
def _compute_total(self):
for record in self:
record.total = record.value + record.value * record.tax
关联字段:
related fields
知识
related 的使用往往依赖于一个 Many2one 字段。
开发中此字段往往用于展示,通过Many2one 字段带出值
(带出的也是Many2one 字段关联模型中的字段值) 特殊计算字段
Related 字段在数据库中是没有存储的,均是每次调用此字段时,通过函数计算出来。 所以,若想要让其他函数引用此 related 字段,必须添加 store = True 属性。
model_id = fields.Many2one('ir.model', string='模型', index=True, Tracking=True)
model_name = fields.Char(related='model_id.name', string='模型名称',
store=True, Tracking=True)
# 修改model_name,model_id也会改变
2.4字段属性
参数 | 描述 |
string(str) | 字段的标题,在UI视图标签中使用。它是可选项,页面显示的字段标签名称。缺省则显示字段本身。 |
default(value 或者callable) | 字段默认值参数。 缺省为空。可设置固定值或者带返回值方法。 |
tracking(bool) | 字段跟踪 (要继承2个模型 _inherit = ['mail.thread', 'mail.activity.mixin'] ) |
store(bool) | 普通字段默认为True,字段值存储数据库表中。 computed字段,默认为False,不在数据库表中存储字段的值。 |
readonly(bool) | 字段只读参数。 默认为False,设置为True时,页面该字段不可编辑。 |
required(bool) | 字段必填参数。默认为False, 设置为True时,页面该字段必输,数据表该字段不能为空。 |
size | char类型字段的字符长度。 |
domain | 过滤条件,应用于关系型字段,value可以是一个函数来生成domain。 |
digits | 精度控制元组,(total, decimal),应用于float字段。 |
ondelete | 适用于many2one字段(谨慎使用) 当所引用的数据被删除时采取的操作, 取值:’set null'、‘restrict'、’cascade' set null: 当b中删除记录时,modelA中相关记录的a=null cascade: 当b中删除记录时,modelA中相关记录也全部删除 restrict: 当b中删除记录时,如果modelA中存在对应记录,则无法操作 b 的删除 如果Many2one字段中没有设置ondelete属性,则默认为set null |
context | context传递变量,应用于关系型字段。 |
limit(int) | one2many、many2many默认的limit数量(80)。 |
compute | 计算字段参数。 |
compute_sudo | 计算超级权限参数。 |
inverse | 逆向计算函数的函数名(可选)。 |
search | 实现该字段search方法的函数名。 |
groups(str) | 权限组参数。默认为空,可以配置权限组的外部id,该字段受权限控制,只能对应组可读写。 |
related | 引用字段参数。设置了该参数的字段相当于是配置字段的一个复制字段 |
translate | 在设置为True时,让字段可翻译 它可根据用户界面的语言保存不同值。 |
help(str) | 是在UI提示中显示的解释性文本。 提示信息(Tooltip) |
index(bool) | 在设置为True时,为该字段创建一个数据库索引, 有时可供更快速搜索使用。 它取代了已弃用的select=1属性。 为频繁read、不频繁write的字段建立索引: index=True(old_api: select)。 |
states(bool) | 这个可以根据state状态的的值动态改变字段在XML中的显示状态。必须配合state状态字段使用。 |
copy(bool) | 可复制参数。默认为True,行记录复制时复制该字段的值;设置为False时,行记录复制时不进行值复制,取默认值赋值。 |
auto_join | Many2one字段支持一个额外的auto_join属性。这个标记允许ORM对这个字段使用SQL连接(join)。因此它不受普通的ORM限制,如用户访问控制和记录权限规则。在具体的用例中,它可以解决性能问题,但建议尽量避免使用。 |
... | ... |