Chương 7: Quan Hệ Giữa Các Mô Hình¶
The previous chapter covered the creation of custom views for a model containing basic fields. However, in any real business scenario we need more than one model. Moreover, links between models are necessary. One can easily imagine one model containing the customers and another one containing the list of users. You might need to refer to a customer or a user on any existing business model.
Trong mô-đun bất động sản của chúng tôi, chúng tôi muốn có thông tin sau cho một tài sản:
khách hàng đã mua tài sản
đại lý bất động sản đã bán tài sản
Loại hình bất động sản: nhà ở, căn hộ, penthouse, lâu đài...
danh sách các thẻ mô tả đặc tính: ấm cúng, đã được cải tạo...
danh sách các lời đề nghị nhận được
Many2one¶
Tham khảo: tài liệu liên quan đến chủ đề này có thể được tìm thấy trong Many2one
.
Ghi chú
Mục tiêu: ở cuối phần này:
một mô hình
estate.property.type
mới phải được tạo với menu, hành động và chế độ xem tương ứng.

ba trường Many2one nên được thêm vào mô hình
estate.property
: loại tài sản, người mua và người bán.

Trong mô-đun bất động sản, chúng tôi muốn xác định khái niệm về loại tài sản. Ví dụ, loại tài sản là một ngôi nhà hoặc một căn hộ. Nhu cầu kinh doanh tiêu chuẩn là phân loại các thuộc tính theo loại của chúng, đặc biệt là để tinh chỉnh quá trình lọc.
Một thuộc tính có thể có loại một, nhưng cùng loại có thể được gán cho nhiều thuộc tính. Điều này được hỗ trợ bởi khái niệm many2one.
Many2one là một liên kết đơn giản đến một đối tượng khác. Ví dụ: để xác định liên kết đến res.partner
trong mô hình thử nghiệm của chúng tôi, chúng tôi có thể viết:
partner_id = fields.Many2one("res.partner", string="Partner")
Theo quy ước, các trường many2one có hậu tố _id
. Việc truy cập dữ liệu trong đối tác sau đó có thể được thực hiện dễ dàng với:
print(my_test_object.partner_id.name)
Xem thêm
Trong thực tế, many2one có thể được xem dưới dạng danh sách thả xuống trong chế độ xem biểu mẫu.
Exercise
Thêm bảng Loại Bất động sản.
Tạo mô hình
estate.property.type
và thêm trường sau:
Cánh đồng |
Kiểu |
Thuộc tính |
---|---|---|
tên |
Char |
yêu cầu |
Thêm các menu như được hiển thị trong Mục tiêu của phần này
Thêm trường
property_type_id
vào mô hìnhestate.property
của bạn và các dạng xem dạng, cây và tìm kiếm của nó
This exercise is a good recap of the previous chapters: you need to create a model, set the model, add an action and a menu, and create a view.
Mẹo: đừng quên nhập bất kỳ tệp Python mới nào trong __init__.py
, thêm tệp dữ liệu mới trong __manifest.py__
hoặc thêm quyền truy cập ;-)
Một lần nữa, khởi động lại máy chủ và làm mới để xem kết quả!
Trong mô-đun bất động sản, vẫn còn thiếu hai thông tin mà chúng tôi muốn có về một tài sản: người mua và nhân viên bán hàng. Người mua có thể là bất kỳ cá nhân nào, nhưng mặt khác người bán hàng phải là nhân viên của đại lý bất động sản (tức là người dùng SoOn).
Trong SoOn, có hai mô hình mà chúng tôi thường nhắc đến:
res.partner
: đối tác là một thực thể vật chất hoặc pháp lý. Nó có thể là một công ty, một cá nhân hoặc thậm chí là một địa chỉ liên lạc.res.users
: người dùng hệ thống. Người dùng có thể là 'nội bộ', tức là họ có quyền truy cập vào phần phụ trợ của SoOn. Hoặc chúng có thể là 'cổng thông tin', tức là họ không thể truy cập vào phần phụ trợ mà chỉ có thể truy cập vào giao diện người dùng (ví dụ: để truy cập các đơn đặt hàng trước đó của họ trong Thương mại điện tử).
Exercise
Thêm người mua và nhân viên bán hàng.
Thêm người mua và nhân viên bán hàng vào mô hình estate.property
bằng cách sử dụng hai mô hình phổ biến được đề cập ở trên. Chúng phải được thêm vào tab mới của chế độ xem biểu mẫu, như được mô tả trong Mục tiêu của phần này.
Giá trị mặc định cho nhân viên bán hàng phải là người dùng hiện tại. Người mua không nên sao chép.
Mẹo: để nhận giá trị mặc định, hãy kiểm tra ghi chú bên dưới hoặc xem ví dụ tại đây .
Ghi chú
Đối tượng self.env
cấp quyền truy cập vào các tham số yêu cầu và những thứ hữu ích khác:
self.env.cr
hoặcself._cr
là đối tượng con trỏ cơ sở dữ liệu; nó được sử dụng để truy vấn cơ sở dữ liệuself.env.uid
hoặcself._uid
là id cơ sở dữ liệu của người dùng hiện tạiself.env.user
là bản ghi của người dùng hiện tạiself.env.context
hoặcself._context
là từ điển ngữ cảnhself.env.ref(xml_id)
trả về bản ghi tương ứng với id XMLself.env[model_name]
trả về một phiên bản của mô hình đã cho
Bây giờ chúng ta hãy xem xét các loại liên kết khác.
Nhiều2nhiều¶
Tham khảo: tài liệu liên quan đến chủ đề này có thể được tìm thấy trong Many2many
.
Ghi chú
Mục tiêu: ở cuối phần này:
một mô hình
estate.property.tag
mới phải được tạo với menu và hành động tương ứng.

các thẻ nên được thêm vào mô hình
estate.property
:

Trong mô-đun bất động sản, chúng tôi muốn xác định khái niệm về thẻ thuộc tính. Ví dụ: thẻ thuộc tính là thuộc tính 'ấm cúng' hoặc 'được cải tạo'.
Một thuộc tính có thể có các thẻ nhiều và một thẻ có thể được gán cho các thuộc tính nhiều. Điều này được hỗ trợ bởi khái niệm many2many.
Many2many là mối quan hệ đa chiề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. Ví dụ: để xác định liên kết đến mô hình account.tax
trên mô hình thử nghiệm của chúng tôi, chúng tôi có thể viết:
tax_ids = fields.Many2many("account.tax", string="Taxes")
Theo quy ước, các trường many2many có hậu tố _ids
. Điều này có nghĩa là một số loại thuế có thể được thêm vào mô hình thử nghiệm của chúng tôi. Nó hoạt động như một danh sách các bản ghi, nghĩa là việc truy cập dữ liệu phải được thực hiện theo một vòng lặp
for tax in my_test_object.tax_ids:
print(tax.name)
Danh sách các bản ghi được gọi là recordset, tức là tập hợp các bản ghi theo thứ tự. Nó hỗ trợ các thao tác Python tiêu chuẩn trên các bộ sưu tập, chẳng hạn như len()
và iter()
, cùng với các thao tác tập hợp bổ sung như recs1 | recs2
.
Exercise
Thêm bảng Thẻ tài sản bất động sản.
Tạo mô hình
estate.property.tag
và thêm trường sau:
Cánh đồng |
Kiểu |
Thuộc tính |
---|---|---|
tên |
Char |
yêu cầu |
Thêm các menu như được hiển thị trong Mục tiêu của phần này
Thêm trường
tag_ids
vào mô hìnhestate.property
của bạn và ở dạng của nó cũng như dạng xem dạng cây
Tip: in the view, use the widget="many2many_tags"
attribute as demonstrated
here.
The widget
attribute will be explained in detail in a later chapter of the training.
For now, you can try to adding and removing it and see the result ;-)
One2many¶
Tham khảo: tài liệu liên quan đến chủ đề này có thể được tìm thấy trong One2many
.
Ghi chú
Mục tiêu: ở cuối phần này:
một mô hình
estate.property.offer
mới phải được tạo với biểu mẫu và chế độ xem dạng cây tương ứng.các ưu đãi nên được thêm vào mô hình
estate.property
:

Trong mô-đun bất động sản, chúng tôi muốn xác định khái niệm về cung cấp tài sản. Ưu đãi bất động sản là số tiền mà người mua tiềm năng cung cấp cho người bán. Giá chào có thể thấp hơn hoặc cao hơn giá dự kiến.
Một ưu đãi áp dụng cho một tài sản, nhưng cùng một tài sản có thể có nhiều ưu đãi. Khái niệm man2one lại xuất hiện. Tuy nhiên, trong trường hợp này, chúng tôi muốn hiển thị danh sách các ưu đãi cho một tài sản nhất định nên chúng tôi sẽ sử dụng khái niệm one2many.
One2many là nghịch đảo của many2one. Ví dụ: chúng tôi đã xác định trên mô hình thử nghiệm của mình một liên kết đến mô hình res.partner
nhờ trường partner_id
. Chúng tôi có thể xác định mối quan hệ nghịch đảo, tức là danh sách các mô hình thử nghiệm được liên kết với đối tác của chúng tôi:
test_ids = fields.One2many("test_model", "partner_id", string="Tests")
Tham số đầu tiên được gọi là comodel
và tham số thứ hai là trường chúng ta muốn nghịch đảo.
Theo quy ước, các trường one2many có hậu tố _ids
. Chúng hoạt động như một danh sách các bản ghi, nghĩa là việc truy cập dữ liệu phải được thực hiện theo vòng lặp:
for test in partner.test_ids:
print(test.name)
Nguy hiểm
Bởi vì One2many
là một mối quan hệ ảo nên phải có một trường Many2one
được xác định trong comodel.
Exercise
Thêm bảng Ưu đãi Bất động sản.
Tạo mô hình
estate.property.offer
và thêm các trường sau:
Cánh đồng |
Kiểu |
Thuộc tính |
Giá trị |
---|---|---|---|
giá |
Trôi nổi |
||
trạng thái |
Lựa chọn |
không được sao chép |
Chấp nhận, từ chối |
đối tác_id |
Many2one ( |
yêu cầu |
|
thuộc tính_id |
Many2one ( |
yêu cầu |
Tạo chế độ xem dạng cây và chế độ xem biểu mẫu với các trường
price
,partner_id
vàstatus
. Không cần phải tạo một hành động hoặc một menu.Thêm trường
offer_ids
vào mô hìnhestate.property
của bạn và ở chế độ xem biểu mẫu như được mô tả trong Mục tiêu của phần này.
Có một số điều quan trọng cần lưu ý ở đây. Đầu tiên, chúng ta không cần một hành động hoặc một menu cho tất cả các kiểu máy. Một số mô hình dự định chỉ được truy cập thông qua một mô hình khác. Đây là trường hợp trong bài tập của chúng ta: một ưu đãi luôn được truy cập thông qua một thuộc tính.
Thứ hai, mặc dù thực tế là trường property_id
là bắt buộc nhưng chúng tôi đã không đưa nó vào chế độ xem. Làm sao SoOn biết ưu đãi của chúng tôi được liên kết với sản phẩm nào? Đó là một phần điều kỳ diệu của việc sử dụng khung SoOn: đôi khi mọi thứ được xác định một cách ngầm định. Khi chúng tôi tạo bản ghi thông qua trường one2many, many2one tương ứng sẽ được điền tự động để thuận tiện.
Still alive? This chapter is definitely not the easiest one. It introduced a couple of new concepts while relying on everything that was introduced before. The next chapter will be lighter, don't worry ;-)