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 viewsactions. Đó 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.

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