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',
	)