odoo 12: 字段(Fields)

原文链接: https://alanhou.org/odoo12-structuring-data/


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



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





参考文章:
https://alanhou.org/odoo12-structuring-data/
https://www.odoo.com/documentation/12.0/reference/orm.html#basic-fields




你可能感兴趣的:(odoo)