本章中的各小节会对已有的那个插件模型做一些小的新增。在上一单中,我们在Odoo实例中注册了自己的插件模块。本章中,我们将深入到模块的数据库端。会添加一个新模型(数据表)、一些新的字符和约束。我们还会研究Odoo中继承的使用。使用的是第三章 创建Odoo插件模块中所创建的模块。
本章中讲解如下小节:
- 定义模型表现及排序
- 向模型添加数据字段
- 使用可配置精度的浮点字段
- 向模型添加货币字段
- 向模型添加关联字段
- 向模型添加等级
- 向模型添加约束验证
- 向模型添加计算字段
- 暴露存储在其它模型中的关联字段
- 使用引用字段添加动态关联
- 使用继承向模型添加功能
- 使用继承拷贝模型定义
- 使用代理继承将功能拷贝至另一个模型
- 使用抽象模型实现可复用模型功能
技术准备
要按照本章中的示例进行操作,你应该要有第三章 创建Odoo插件模块中所创建的模块并且该模型应可用。
本章中使用的代码可以在GitHub仓库中进行下载,地址为https://github.com/alanhou/odoo14-cookbook/tree/main/Chapter04。
**译者注:**本文中对多处模型修改相应的视图字段修改未作表述,请参见 GitHub代码views/library_book.xml文字
定义模型表示及排序
模型中有结构性属性来定义它们的行为。这些以下划线作为前缀。最重要的属性是_name,因为这定义了内部全局标识符。Odoo内部通过这一_name属性来创建数据表。例如,如果你使用_name=“library.book”,那么Odoo ORM会在数据库中创建一张library_book数据表。这也是为什么_name必须在Odoo系统中要保持唯一。
在模型中可以使用另外两个属性:
- _rec_name 是一个设置用于展示或记录标题的字段
- 另一个是_order, 用于设置记录的展现的顺序。
准备工作
这一节中我们假定你已经有一个my_library模块的实例,如第三章 创建Odoo插件模块中所描述。
如何实现…
my_library实例应包含一个名为models/library_book.py的Python文件,它定义了一个基础模型。我们将编辑该文件来在_name之后添加一个新的类级属性:
-
加入如下代码来添加一个用户友好的模型标题:
_description = 'Library Book'译者注:为避免读者对命令行中的 WARNING 产生困扰,我在上一章的示例代码中已添加该属性
-
首先对记录进行排序(按时间最近排序,然后按标题排序),添加如下代码:
_order = 'date_release desc, name' -
添加如下代码来使用short_name字段作为记录的表示:
_rec_name = 'short_name' short_name = fields.Char('Short Title', required=True) -
在表单视图中添加short_name字段,这样会在该视图中显示这一新字段:
<field name="short_name"/>
完成如上操作之后,我们library_book.py文件应该是下面这样:
from odoo import models, fields
class LibraryBook(models.Model):
_name = 'library.book'
_description = 'Library Book'
_order = 'date_release desc, name'
_rec_name = 'short_name'
name = fields.Char('Title', required=True)
short_name = fields.Char('Short Title', required=True)
date_release = fields.Date('Release Date')
author_ids = fields.Many2many('res.partner', string='Authors')
你的library_book.xml 文件中的