第四章:模型和基本字段?
在 上一章節 的結尾,我們成功創建了一個Odoo模塊。然而,此時它仍然是一個空殼,無法存儲任何數據。在我們的房地產模塊中,我們想要將與房產相關的信息(名稱、描述、價格、居住面積等)存儲在數據庫中。Odoo框架提供了工具來簡化數據庫交互。
在繼續練習之前,請確保已安裝 estate
模塊,即在應用程序列表中必須顯示為“已安裝”。
對象關系映射?
參考 : 有關此主題的文檔可以在 模型 API 中找到。
注解
目標 : 完成本節后,應創建表 estate_property
:
$ psql -d rd-demo
rd-demo=# SELECT COUNT(*) FROM estate_property;
count
-------
0
(1 row)
Odoo的一個關鍵組件是 ORM`_層。這一層避免了手動編寫大部分 `SQL,并提供了可擴展性和安全性服務2。
業務對象是聲明為擴展 Model
的Python類,將它們集成到自動持久性系統中。
模型可以通過在其定義中設置屬性來進行配置。最重要的屬性是: _name
,它是必需的,并定義了模型在Odoo系統中的名稱。這是一個模型的最小定義:
from odoo import models
class TestModel(models.Model):
_name = "test.model"
這個定義足以讓ORM生成一個名為 test_model
的數據庫表。模型中的 .
會被ORM自動轉換為 _
。按照慣例,所有的模型都位于 models
目錄中,每個模型都在自己的Python文件中定義。
看一下如何定義 crm_recurring_plan
表以及如何導入相應的Python文件:
該模型定義在文件
crm/models/crm_recurring_plan.py
中(參見 此處)文件
crm_recurring_plan.py
被導入到crm/models/__init__.py
中 (參見 這里)文件夾
models
在crm/__init__.py
中被導入(參見 這里)
Exercise
定義房地產屬性模型。
根據CRM模塊中給出的示例,為 estate_property
表創建適當的文件和文件夾。
創建文件后,為 estate.property
模型添加最小定義。
任何 Python 文件的修改都需要重新啟動 Odoo 服務器。當我們重新啟動服務器時,我們將添加參數 -d
和 -u
:
$ ./odoo-bin --addons-path=../custom,../enterprise/,addons -d rd-demo -u estate
-u estate
表示我們要升級 estate
模塊,即 ORM 將應用數據庫模式更改。在這種情況下,它會創建一個新表。 -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
進行雙重檢查。
Exercise
添加描述。
在你的模型中添加一個 _description
來消除其中一個警告。
模型字段?
參考 : 有關此主題的文檔可以在 字段 API 中找到。
字段用于定義模型可以存儲什么以及它們存儲在哪里。字段在模型類中定義為屬性:
from odoo import fields, models
class TestModel(models.Model):
_name = "test.model"
_description = "Test Model"
name = fields.Char()
name
字段是一個 Char
,它將被表示為 Python 的 unicode str
和 SQL 的 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
。
Exercise
向房地產物業表添加基本字段。
將以下基本字段添加到表中:
字段 |
類型 |
---|---|
名稱 |
字符 |
描述 |
文本 |
郵政編碼 |
字符 |
可用日期 |
日期 |
期望價格 |
浮點數 |
銷售價格 |
浮點數 |
臥室數 |
整數 |
生活區域 |
整數 |
門面 |
整數 |
車庫 |
布爾值 |
花園 |
布爾值 |
花園面積 |
整數 |
花園方向 |
選擇 |
garden_orientation
字段必須有4個可能的值:’North’、’South’、’East’和’West’。選擇列表被定義為元組列表,參見 `這里<https://github.com/odoo/odoo/blob/b0e0035b585f976e912e97e7f95f66b525bc8e43/addons/crm/report/crm_activity_report.py#L31-L34>`__的示例。
當字段添加到模型中后,請使用 -u estate
選項重啟服務器
$ ./odoo-bin --addons-path=../custom,../enterprise/,addons -d rd-demo -u estate
連接到 psql
并檢查表格 estate_property
的結構。您會注意到還添加了一些額外的字段。我們稍后會重新訪問它們。
常用屬性?
注解
目標 :本節結束時,表 estate_property
中的列 name
和 expected_price
應為非空:
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
,默認值:字段名稱)用戶界面中字段的標簽(用戶可見)。
required
(bool
,默認值:False
)如果為“True”,則該字段不能為空。它必須具有默認值或在創建記錄時始終給定一個值。
help
(str
,默認值:''
)為用戶提供UI中的長形幫助工具提示。
index
(bool
,默認值:False
)請求Odoo在該列上創建一個 數據庫索引。
Exercise
為現有字段設置屬性。
添加以下屬性:
字段 |
屬性 |
---|---|
名稱 |
必填 |
期望價格 |
必填 |
重啟服務器后,兩個字段都應該是非空的。
自動字段?
參考 : 有關此主題的文檔可以在 自動字段 中找到。
你可能已經注意到你的模型有一些你沒有定義的字段。Odoo 在所有模型中創建了一些字段1。這些字段由系統管理,不能被寫入,但如果有用或必要,它們可以被讀?。?/p>
id
(Id
)模型記錄的唯一標識符。
create_date
(Datetime
)記錄創建日期。
create_uid
(Many2one
)創建記錄的用戶。
write_date
(Datetime
)記錄的最后修改日期。
write_uid
(Many2one
)最后修改記錄的用戶。
現在我們已經創建了第一個模型,讓我們 添加一些安全性 !
- 1
可以 禁用某些字段的自動創建
- 2
編寫原始的 SQL 查詢是可能的,但需要謹慎,因為這將繞過所有 Odoo 的身份驗證和安全機制。