Xác định dữ liệu mô-đun¶
Quan trọng
This tutorial is an extension of the Server framework 101 tutorial. Make sure you have
completed it and use the estate
module you have built as a base for the exercises in this
tutorial.
Loại dữ liệu¶
Dữ liệu chủ¶
Dữ liệu chủ thường là một phần của yêu cầu kỹ thuật hoặc kinh doanh đối với mô-đun. Nói cách khác, dữ liệu đó thường cần thiết để mô-đun hoạt động bình thường. Dữ liệu này sẽ luôn được cài đặt khi cài đặt mô-đun.
Chúng tôi đã đáp ứng dữ liệu kỹ thuật trước đây vì chúng tôi đã xác định views và actions. Đó là một loại dữ liệu chủ.
Ngoài dữ liệu kỹ thuật, dữ liệu kinh doanh có thể được xác định, ví dụ: quốc gia, tiền tệ, đơn vị đo lường cũng như bản địa hóa quốc gia hoàn chỉnh (báo cáo pháp lý, định nghĩa thuế, biểu đồ tài khoản) và nhiều hơn nữa...
Dữ liệu demo¶
Ngoài dữ liệu chính, vốn là yêu cầu để mô-đun hoạt động bình thường, chúng tôi cũng muốn có dữ liệu cho mục đích trình diễn:
Giúp đại diện bán hàng thực hiện bản demo của họ một cách nhanh chóng.
Có một bộ dữ liệu hoạt động để các nhà phát triển thử nghiệm các tính năng mới và xem các tính năng mới này trông như thế nào với dữ liệu mà họ có thể không tự thêm vào.
Kiểm tra xem dữ liệu có được tải chính xác không, không gây ra lỗi.
Thiết lập hầu hết các tính năng để sử dụng nhanh chóng khi tạo cơ sở dữ liệu mới.
Dữ liệu demo được tải tự động khi bạn khởi động máy chủ nếu bạn không nói rõ ràng là bạn không muốn nó. Điều này có thể được thực hiện trong trình quản lý cơ sở dữ liệu hoặc bằng dòng lệnh.
$ ./odoo-bin -h
Usage: odoo-bin [options]
Options:
--version show program's version number and exit
-h, --help show this help message and exit
Common options:
[...]
--without-demo=WITHOUT_DEMO
disable loading demo data for modules to be installed
(comma-separated, use "all" for all modules). Requires
-d and -i. Default is none
[...]
$ ./odoo-bin --addons-path=... -d db -i account --without-demo=all
Khai báo dữ liệu¶
Rõ ràng¶
Tham khảo: tài liệu liên quan đến chủ đề này có thể được tìm thấy trong Module Manifests.
Dữ liệu được khai báo ở dạng CSV hoặc XML. Mỗi tệp chứa dữ liệu phải được thêm vào tệp kê khai để chúng được tải.
Các khóa sử dụng trong bảng kê khai để thêm dữ liệu mới là data
cho dữ liệu chính và `` demo`` cho dữ liệu demo. Cả hai giá trị phải là danh sách các chuỗi biểu thị đường dẫn tương đối tới các tệp khai báo dữ liệu.
Thông thường, dữ liệu demo nằm trong thư mục `` demo``, các lượt xem và hành động nằm trong thư mục views
, dữ liệu liên quan đến bảo mật nằm trong thư mục bảo mật
và các dữ liệu khác nằm trong ``data` ` thư mục.
Nếu cây công việc của bạn trông như thế này:
estate
├── data
│ └── master_data.xml
├── demo
│ └── demo_data.xml
├── models
│ ├── *.py
│ └── __init__.py
├── security
│ └── ir.model.access.csv
├── views
│ └── estate_property_offer_views.xml
├── __init__.py
└── __manifest__.py
Bảng kê khai của bạn sẽ trông như thế này:
# -*- coding: utf-8 -*-
{
"name": "Real Estate",
"depends": [
...
],
"data": [
"security/ir.model.access.csv", # CSV and XML files are loaded at the same place
"views/estate_property_offer_views.xml", # Views are data too
"data/master_data.xml", # Split the data in multiple files depending on the model
],
"demo": [
"demo/demo_data.xml",
]
"application": True,
}
CSV¶
Tham khảo: tài liệu liên quan đến chủ đề này có thể được tìm thấy trong CSV data files.
Cách dễ nhất để khai báo dữ liệu đơn giản là sử dụng định dạng CSV. Tuy nhiên, điều này bị hạn chế về mặt tính năng: sử dụng nó cho danh sách dài các mô hình đơn giản, nhưng mặt khác lại thích XML hơn.
id,field_a,field_b,related_id:id
id1,valueA1,valueB1,module.relatedid
id2,valueA2,valueB2,module.relatedid
Mẹo
IDE của bạn có thể có tiện ích mở rộng để đánh dấu cú pháp của tệp CSV
Exercise
Thêm một số Loại Bất động sản tiêu chuẩn cho mô-đun bất động sản
: Khu dân cư, Thương mại, Công nghiệp và Đất đai. Những thứ này phải luôn được cài đặt.
XML¶
Tham khảo: tài liệu liên quan đến chủ đề này có thể được tìm thấy trong Data Files.
Khi dữ liệu cần tạo phức tạp hơn, việc thực hiện việc đó bằng XML có thể hữu ích hoặc thậm chí cần thiết.
<odoo>
<record id="id1" model="tutorial.example">
<field name="field_a">valueA1</field>
<field name="field_b">valueB1</field>
</record>
<record id="id2" model="tutorial.example">
<field name="field_a">valueA2</field>
<field name="field_b">valueB2</field>
</record>
</odoo>
Exercise
Tạo một số dữ liệu demo cho mô-đun estate
.
Cánh đồng |
Giá trị |
Giá trị |
---|---|---|
tên |
Biệt thự lớn |
xe kéo về nhà |
tình trạng |
Mới |
Đã hủy |
Sự miêu tả |
Một biệt thự đẹp và lớn |
Nhà trong một công viên xe kéo |
mã bưu điện |
12345 |
54321 |
ngày_có sẵn |
43863 |
25569 |
Giá cả dự kiến |
1.600.000 |
100,000 |
gia ban |
120,000 |
|
phòng ngủ |
6 |
1 |
khu vực sống |
100 |
10 |
mặt tiền |
4 |
4 |
ga-ra |
True |
False |
vườn |
True |
|
khu_vườn |
100000 |
|
vườn_định hướng |
Phía nam |
Tiện ích mở rộng dữ liệu¶
During the Core Training, we saw in the Chương 12: Kế Thừa chapter we could inherit (extend) an existing view. This was a special case of data extension: any data can be extended in a module.
Khi bạn thêm các trường mới vào mô hình hiện có trong một mô-đun mới, bạn có thể muốn điền các trường đó vào các bản ghi được tạo trong các mô-đun mà bạn phụ thuộc vào. Việc này được thực hiện bằng cách cung cấp xml_id
của bản ghi mà bạn muốn mở rộng. Nó sẽ không thay thế nó, trong trường hợp này chúng ta sẽ đặt field_c
thành giá trị đã cho cho cả hai bản ghi.
<odoo>
<record id="id1" model="tutorial.example">
<field name="field_c">valueC1</field>
</record>
<record id="id2" model="tutorial.example">
<field name="field_c">valueC2</field>
</record>
</odoo>
`` giới thiệu``¶
Các trường liên quan có thể được đặt bằng phím ref
. Giá trị của key đó chính là xml_id
của bản ghi bạn muốn liên kết. Hãy nhớ xml_id
bao gồm tên của mô-đun nơi dữ liệu được khai báo lần đầu tiên, theo sau là dấu chấm, theo sau là id
của bản ghi (chỉ id
cũng hoạt động nếu bạn nằm trong mô-đun khai báo nó).
<odoo>
<record id="id1" model="tutorial.example">
<field name="related_id" ref="module.relatedid"/>
</record>
</odoo>
Exercise
Tạo một số ưu đãi dữ liệu demo cho các thuộc tính bạn đã tạo.
Tạo ưu đãi bằng cách sử dụng các đối tác được xác định trong base
Cộng sự |
Assets |
Giá |
hiệu lực |
---|---|---|---|
Nội thất Azure |
Biệt thự lớn |
10000 |
14 |
Nội thất Azure |
Biệt thự lớn |
1500000 |
14 |
Người nghiện trang trí |
Biệt thự lớn |
1500001 |
14 |
Exercise
Đảm bảo cả hai thuộc tính demo của bạn đều được tạo với Loại thuộc tính được đặt thành Khu dân cư.
`` đánh giá``¶
The value to assign to a field is not always a simple string and you might need to compute it. It can also be used to optimize the insertion of related values, or because a constraint forces you to add the related values in batch. See :Add X2many fields.
<odoo>
<record id="id1" model="tutorial.example">
<field name="year" eval="datetime.now().year+1"/>
</record>
</odoo>
Exercise
Các ưu đãi bạn đã thêm phải luôn có ngày liên quan đến việc cài đặt mô-đun.
tìm kiếm
¶
Đôi khi, bạn cần gọi ORM để thực hiện tìm kiếm. Điều này không khả thi với định dạng CSV.
<odoo>
<record id="id1" model="account.move.line">
<field name="account_id" search="[
('user_type_id', '=', ref('account.data_account_type_direct_costs')),
('company_id', '=', obj().env.company.id)]
"/>
</record>
</odoo>
Trong đoạn mã này, nó cần thiết vì dữ liệu chính phụ thuộc vào bản địa hóa được cài đặt.
chức năng
¶
Bạn cũng có thể cần thực thi mã python khi tải dữ liệu.
<function model="tutorial.example" name="action_validate">
<value eval="[ref('demo_invoice_1')]"/>
</function>
Exercise
Xác thực một trong các ưu đãi dữ liệu demo bằng cách sử dụng nút "Chấp nhận ưu đãi". Từ chối những người khác.
Thêm trường X2many¶
Tham khảo: tài liệu liên quan đến chủ đề này có thể được tìm thấy trong Command
.
Nếu bạn cần thêm dữ liệu liên quan vào trường One2many hoặc Many2many, bạn có thể làm như vậy bằng cách sử dụng các phương thức Command
.
<odoo>
<record id="id1" model="tutorial.example">
<field name="related_ids" eval="[
Command.create({
'name': 'My name',
}),
Command.create({
'name': 'Your name',
}),
Command.link(ref('model.xml_id')),
]"/>
</record>
</odoo>
Exercise
Tạo một Thuộc tính mới, nhưng lần này với một số ưu đãi được tạo trực tiếp bên trong trường One2many được liên kết với Ưu đãi.
Truy cập dữ liệu¶
Cảnh báo
Bạn không bao giờ nên truy cập dữ liệu demo bên ngoài phần khai báo dữ liệu demo, ngay cả trong các thử nghiệm.
Có nhiều cách để truy cập dữ liệu chính/bản demo.
Trong mã python, bạn có thể sử dụng phương thức env.ref(self, xml_id, raise_if_not_found=True)
. Nó trả về tập bản ghi được liên kết với xml_id
mà bạn chỉ định.
Trong XML, bạn có thể sử dụng khóa ref
như thế này
<odoo>
<record id="id1" model="tutorial.example">
<field name="related_id" ref="module.relatedid"/>
</record>
</odoo>
Nó sẽ gọi phương thức ref và lưu trữ id của bản ghi được trả về trên trường `` có liên quan_id`` của bản ghi loại tutorial.example
có id id1
.
Trong CSV, tiêu đề của cột phải có hậu tố :id
hoặc /id
.
id,parent_id:id,name
"child1","module.parent","Name1"
"child2","module.parent","Name2"
"child3","module.parent","Name3"
In SQL, it is more complicated, see the advanced section.
Cảnh báo
Dữ liệu luôn có thể bị xóa bởi người dùng. Luôn viết mã phòng thủ, có tính đến điều này.
Trình độ cao¶
Mã định danh XML là gì?¶
Vì chúng ta không muốn có một cột xml_id
trong mỗi bảng SQL của cơ sở dữ liệu nên chúng ta cần một cơ chế để lưu trữ nó. Việc này được thực hiện với mô hình ir.model.data
.
Nó chứa tên của bản ghi (xml_id
) cùng với mô-đun mà nó được xác định, mô hình xác định nó và id của nó.
Không có cập nhật¶
Các bản ghi được tạo bằng cờ noupdate
sẽ không được cập nhật khi nâng cấp mô-đun đã tạo ra chúng, nhưng nó sẽ được tạo nếu nó chưa tồn tại.
Ghi chú
odoo-bin -i module
sẽ bỏ qua cài đặt này và luôn tải dữ liệu. Nhưng thông thường người ta không nên làm điều này trên cơ sở dữ liệu sản xuất.
<odoo noupdate="1">
<record id="id1" model="model">
<field name="fieldA" eval="True"/>
</record>
</odoo>
Nhập dưới dạng SQL¶
Trong một số trường hợp, việc nhập trực tiếp bằng SQL là điều hợp lý. Tuy nhiên, điều này không được khuyến khích vì nó bỏ qua tất cả các tính năng của ORM, các trường được tính toán (bao gồm cả siêu dữ liệu) và các ràng buộc python.
Ghi chú
Nói chung, việc sử dụng SQL thô cũng bỏ qua ACL và làm tăng rủi ro bị tiêm nhiễm.
Tham khảo: Bảo mật trong SoOn
Nó có thể giúp tăng tốc thời gian nhập lên rất nhiều với các tệp lớn.
Đối với các thao tác nhập phức tạp hơn, chẳng hạn như bản dịch.
Có thể cần phải khởi tạo cơ sở dữ liệu.