在上一章的末尾,我们能够 创建一个Odoo模块。然而,在这一点上,它仍然是一个空壳,不允许我们 存储任何数据。在我们的房地产模块中,我们希望存储与 属性(名称、描述、价格、居住面积等)。Odoo框架提供 促进数据库交互的工具。
在继续练习之前,请确保已安装模块,即 必须在“应用”列表中显示为“已安装”。estate
警告
不要使用可变的全局变量。
单个Odoo实例可以在同一个python进程中并行运行多个数据库。 这些数据库中的每一个都可能安装不同的模块,因此我们不能依赖 将根据已安装的模块进行更新的全局变量。
对象关系映射
参考:可以在模型API 中找到与此主题相关的文档。
注意
目标:在本节结束时,应创建表:estate_property
$ psql -d rd-demo
rd-demo=# SELECT COUNT(*) FROM estate_property;
count
-------
0
(1 row)
Odoo的一个关键组件是ORM层。 此层避免了手动编写大多数 SQL,并提供了可扩展性和安全性服务.
业务对象被声明为扩展的 Python 类Model,从而将它们集成到自动化中 持久性系统。
模型可以通过在其 定义。最重要的属性是 ,它是必需的,它定义了 Odoo系统中的模型。以下是 型:_name
from odoo import models
class TestModel(models.Model):
_name = "test_model"
此定义足以让 ORM 生成名为 的数据库表。由 约定:所有模型都位于一个目录中,每个模型都以自己的方式定义 Python 文件。test_model
models
看看表是如何定义的,以及相应的 Python 是如何定义的 文件已导入:crm_recurring_plan
-
模型在文件中定义(请参阅此处
crm/models/crm_recurring_plan.py
) -
文件导入到(请参阅此处
crm_recurring_plan.py
crm/models/__init__.py
) -
文件夹已导入(请参阅此处
models
crm/__init__.py
)
锻炼
定义房地产属性模型。
根据 CRM 模块中给出的示例,为表创建适当的文件和文件夹。estate_property
创建文件后,为模型添加最低定义。estate.property
对Python文件的任何修改都需要重新启动Odoo服务器。当我们重新启动时 服务器,我们将添加参数和:-d
-u
$ ./odoo-bin --addons-path=addons,../enterprise/,../tutorials/ -d rd-demo -u estate
-u estate
表示我们要升级模块,即 ORM 将 应用数据库架构更改。在本例中,它会创建一个新表。 方法 应在数据库上执行升级。 应始终用于 与 组合 .estate
-d rd-demo
rd-demo
-u
-d
在启动过程中,您应看到以下警告:
...
WARNING rd-demo odoo.models: The model estate.property has no _description
...
WARNING rd-demo odoo.modules.loading: The model estate.property has no access rules, consider adding one...
...
如果是这样的话,那么你应该很好!可以肯定的是,请仔细检查,如 目标。psql
锻炼
添加说明。
将 a 添加到模型以删除其中一个警告。_description
模型字段
参考:可以在 Fields API 中找到与此主题相关的文档。
字段用于定义模型可以存储的内容及其存储位置。字段是 定义为模型类中的属性:
from odoo import fields, models
class TestModel(models.Model):
_name = "test_model"
_description = "Test Model"
name = fields.Char()
该字段是一个name
Char它将表示为 Python unicode 和 SQL .str
VARCHAR
类型
注意
目标:在本节末尾,应将几个基本字段添加到表中:estate_property
$ psql -d rd-demo
rd-demo=# \d estate_property;
Table "public.estate_property"
Column | Type | Collation | Nullable | Default
--------------------+-----------------------------+-----------+----------+---------------------------------------------
id | integer | | not null | nextval('estate_property_id_seq'::regclass)
create_uid | integer | | |
create_date | timestamp without time zone | | |
write_uid | integer | | |
write_date | timestamp without time zone | | |
name | character varying | | |
description | text | | |
postcode | character varying | | |
date_availability | date | | |
expected_price | double precision | | |
selling_price | double precision | | |
bedrooms | integer | | |
living_area | integer | | |
facades | integer | | |
garage | boolean | | |
garden | boolean | | |
garden_area | integer | | |
garden_orientation | character varying | | |
Indexes:
"estate_property_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
"estate_property_create_uid_fkey" FOREIGN KEY (create_uid) REFERENCES res_users(id) ON DELETE SET NULL
"estate_property_write_uid_fkey" FOREIGN KEY (write_uid) REFERENCES res_users(id) ON DELETE SET NULL
有两大类字段:“简单”字段,它们是原子的 直接存储在模型表中的值,以及链接的“关系”字段 记录(相同或不同型号)。
简单的字段示例是Boolean,Float,Char,Text,Date和Selection.
锻炼
将基本字段添加到“不动产属性”表中。
将以下基本字段添加到表中:
田 |
类型 |
---|---|
名字 |
煳 |
描述 |
发短信 |
邮政编码 |
煳 |
date_availability |
日期 |
expected_price |
浮 |
selling_price |
浮 |
卧室 |
整数 |
living_area |
整数 |
立 面 |
整数 |
车库 |
布尔 |
花园 |
布尔 |
garden_area |
整数 |
garden_orientation |
选择 |
该字段必须有 4 个可能的值:“North”、“South”、“East” 和“西方”。选择列表定义为元组列表,有关示例,请参阅此处。garden_orientation
将字段添加到模型后,使用-u estate
$ ./odoo-bin --addons-path=addons,../enterprise/,../tutorials/ -d rd-demo -u estate
连接到并检查表的结构。你会注意到 表中还添加了几个额外的字段。我们稍后会重新审视它们。psql
estate_property
通用属性
注意
目标:在本节末尾,列 和 应 在表中不可为空:name
expected_price
estate_property
rd-demo=# \d estate_property;
Table "public.estate_property"
Column | Type | Collation | Nullable | Default
--------------------+-----------------------------+-----------+----------+---------------------------------------------
...
name | character varying | | not null |
...
expected_price | double precision | | not null |
...
与模型本身非常相似,字段可以通过传入来配置 配置属性作为参数:
name = fields.Char(required=True)
某些属性在所有字段上都可用,以下是最常见的属性:
string
(str
,默认值:字段名称)
UI 中字段的标签(用户可见)。
required
(bool
违约:False
)
如果 ,则该字段不能为空。它必须具有默认值 值或在创建记录时始终被赋予一个值。True
help
(str
违约:''
)
在 UI 中为用户提供长格式帮助工具提示。
index
(bool
违约:False
)
请求Odoo在列上创建数据库索引。
锻炼
设置现有字段的属性。
添加以下属性:
田 |
属性 |
---|---|
名字 |
必填 |
expected_price |
必填 |
重新启动服务器后,这两个字段都不应为空。
自动字段
参考:与本主题相关的文档可在“自动”字段中找到。
您可能已经注意到,您的模型有一些您从未定义过的字段。 Odoo在所有模型中创建了一些字段1.这些字段是 由系统管理,不能写入,但如果出现以下情况,可以读取它们 有用或必要:
id
(Id
)
模型记录的唯一标识符。
create_date
(Datetime)
记录的创建日期。
create_uid
(Many2one)
创建记录的用户。
write_date
(Datetime)
记录的最后修改日期。
write_uid
(Many2one)
上次修改记录的用户。
现在我们已经创建了第一个模型,让我们添加一些安全性!
编写原始 SQL 查询是可能的,但需要谨慎,因为这样 绕过所有Odoo身份验证和安全机制。