III. Xây dựng mô-đun – Building modules
4. Quan hệ giữa các mô hình
Bản ghi từ mô hình có thể liên quan đến bản ghi từ mô hình khác. Ví dụ: bản ghi lệnh bán hàng có liên quan đến bản ghi khách hàng có chứa dữ liệu máy khách; nó cũng liên quan đến hồ sơ dòng đơn đặt hàng bán hàng của nó.
Bài tập
Tạo mô hình phiên
Đối với mô-đun Học viện mở, chúng tôi xem xét một mô hình cho các phiên: một phiên là
sự xuất hiện của một khóa học được dạy tại một thời điểm nhất định cho một đối tượng nhất định.
Tạo mô hình cho phiên. Một phiên có tên, ngày bắt đầu, thời gian và số lượng chỗ ngồi.
Thêm một hành động và một mục menu để hiển thị chúng. Làm cho mô hình mới hiển thị thông qua mục menu.
Trường quan hệ
Các trường quan hệ liên kết các bản ghi, một trong hai mô hình tương tự (cấu trúc phân cấp) hoặc giữa các mô hình khác nhau.
Các loại trường quan hệ là:
Many2one(other_model, ondelete='set null')
Một liên kết đơn giản đến một đối tượng khác: print foo.other_id.name
See also foreign keys
One2many(other_model, related_field)
Một mối quan hệ ảo, nghịch đảo của Many2one. One2many hoạt động như một vùng chứa các bản ghi, truy cập nó dẫn đến một tập hợp các bản ghi (có thể trống) :
for other in foo.other_ids: print other.name
Nguy hiểm
Bởi vì One2many là một mối quan hệ ảo, phải có một trườngMany2one trong
other_model và tên của nó phải được related_field
Many2many(other_model)
Mối quan hệ nhiều hai chiều, bất kỳ bản ghi nào ở một bên đều có thể liên quan đến bất kỳ số lượng bản ghi nào ở phía bên kia. Hoạt động như một vùng chứa các bản ghi, truy cập nó cũng dẫn đến một tập hợp các bản ghi có thể trống:
for other in foo.other_ids: print other.name
Bài tập
Các mối quan hệ Many2one
Sử dụng nhiều - một, sửa đổi các mô hình Khóa học và Phiên để phản ánh mối quan hệ
của họ với các mô hình khác:
● Một khóa học có người dùng có trách nhiệm; giá trị của trường đó là bản ghi của
res.users mô hình res.users
● Một phiên có một người hướngdẫn ; giá trị của trường đó là một bản ghi của res.partner
res.users.
● Một phiên có liên quan đến một khóa học; giá trị của trường đó là một bản ghi của mô
hình openacademy.coursevà được yêu cầu.
● Điều chỉnh chế độ xem.
Bài tập
Nghịch đảo các mối quan hệ one2many
Sử dụng trường quan hệ nghịch đảo one2many, sửa đổi các mô hình để phản ánh mối quan hệ giữa các khóa học và phiên.
Bài tập
Nhiều mối quan hệ đa phương
Sử dụng trường quan hệ nhiều - nhiều, sửa đổi mô hình Phiên để liên quan mỗi phiên với
một tập hợp những người tham dự. Người tham dự sẽ được đại diện bởi hồ sơ đối tác, vì vậy
chúng tôi sẽ liên quan đến res.partner mô hình tích hợp. Điều chỉnh các quan điểm cho phù hợp.
5. Kế thừa
Kế thừa mô hình
Cơ chế kế thừa đầu tiên cho phép một mô-đun sửa đổi hành vi của một mô hình được xác định trong một mô-đun khác:
● thêm trường vào mô hình,
● ghi đè định nghĩa của các trường trên mô hình, ● thêm ràng buộc vào mô hình,
● thêm phương pháp vào mô hình,
● ghi đè các phương pháp hiện có trên mô hình.
Cơ chế kế thừa thứ hai (ủy quyền) cho phép liên kết mọi bản ghi của mô hình với bản ghi trong mô hình cha và cung cấp quyền truy cập minh bạch vào các trường của bản ghi mẹ.
Xem thêm
● _inherit ● _inherits
Thay vì sửa đổi các chế độ xem hiện có tại chỗ (bằng cách ghi đè chúng), Odoo cung cấp tính năng kế thừa dạng xem trong đó chế độ xem "phần mở rộng" của trẻ em được áp dụng trên các chế độ xem gốc và có thể thêm hoặc xóa nội dung khỏi cha mẹ của chúng.
Dạng xem phần mở rộng tham chiếu đến cha mẹ của nó bằng cách sử dụng trường inherit_id và thay vì một chế độ xem duy nhất, trường arch của nó bao gồm bất kỳ số lượng thành phần xpath nào chọn và thay đổi nội dung của dạng xem mẹ của chúng:
<!-- improved idea categories list -->
<recordid="idea_category_list2"model="ir.ui.view">
<fieldname="name">id.category.list2</field>
<fieldname="model">idea.category</field>
<fieldname="inherit_id"ref="id_category_list"/>
<fieldname="arch"type="xml">
<!-- find field description and add the field idea_ids after it -->
<xpathexpr="//field[@name='description']"position="after">
<fieldname="idea_ids"string="Number of ideas"/>
</xpath>
</field> </record>
expr
Biểu thức XPath chọn một phần tử duy nhất trong dạng xem mẹ. Gây ra lỗi nếu nó khớp với không có phần tử hoặc nhiều hơn một
position
Thao tác để áp dụng cho phần tử phù hợp:
inside
nối cơ thể của xpathở cuối phần tử phù hợp
replace
thay thế phần tử phù hợp bằng cơ thể của xpath,thay thế bất kỳ sự xuất hiện nút $ 0 nào trong cơ thể mới bằng phần tử ban đầu
before
chèn cơ thể của xpathnhư một anh chị em trước yếu tố phù hợp
after
chèn cơ thể của xpathsnhư một anh chị em sau khi yếu tố phù hợp
attributes
thay đổi các thuộc tính của phần tử phù hợp bằng cách sử dụng các yếu tố thuộc tính đặc biệt trong cơthể củaxpath
Mẹo
Khi khớp với một phần tử duy nhất, thuộc tính position vị trí có thể được đặt trực tiếp trên phần tử được tìm thấy. Cả hai thừa kế dưới đây sẽ cho kết quả giống nhau.
<xpathexpr="//field[@name='description']"position="after">
<fieldname="idea_ids"/> </xpath>
<fieldname="description"position="after">
<fieldname="idea_ids"/> </field>
Bài tập
Thay đổi nội dung hiện có
● Sử dụng kế thừa mô hình, sửa đổi mô hình Đối tác hiện có để thêm trường
instructor boolean người hướng dẫn và trường Many2many tương ứng với mối quan hệ đối tác phiên
● Sử dụng kế thừa dạng xem, hiển thị các trường này trong dạng xem biểu mẫu đối tác
Tên miền
Trong Odoo, Tìm kiếm tên miền các giá trị mã hóa các điều kiện trên bản ghi. Tên miền là danh sách các tiêu chí được sử dụng để chọn một tập hợp con các bản ghi của mô hình. Mỗi tiêu chí là một bộ ba với một tên trường, một toán tử và một giá trị.
Ví dụ: khi được sử dụng trên mô hìnhSản phẩm, miền sau chọn tất cả các dịch vụ có đơn giá trên 1000:
[('product_type', '=', 'service'), ('unit_price', '>', 1000)]
Theo tiêu chí mặc định được kết hợp với một AND ngầm. Các toán tử logic &(AND), | (OR) và! (KHÔNG) có thể được sử dụng để kết hợp rõ ràng các tiêu chí. Chúng được sử dụng ở vị trí tiền tố (toán tử được chèn trước các đối số của nó chứ không phải giữa). Ví dụ: để chọn sản phẩm "là dịch vụ HOẶC có đơn giá KHÔNG phải từ 1000 đến 2000":
['|',
('product_type', '=', 'service'), '!', '&',
('unit_price', '>=', 1000), ('unit_price', '<', 2000)]
Tham số domain có thể được thêm vào các trường quan hệ để giới hạn các bản ghi hợp lệ cho mối quan hệ khi cố gắng chọn các bản ghi trong giao diện máy khách.
Bài tập
Tên miền trên các trường quan hệ
Khi chọn người hướng dẫn cho một phiên, chỉ có người hướng dẫn (đối tác với người
hướng dẫn được đặt thành True)mới được hiển thị.
Tên miền phức tạp hơn
Tạo danh mục đối tác mới Giáo viên / Cấp độ 1 và Giáo viên / Cấp độ 2. Người hướng
dẫn cho một buổi học có thể là người hướng dẫn hoặc giáo viên (ở bất kỳ cấp độ nào).