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.

Loại tài sản
  • 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.

Assets

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

khóa ngoại

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ình estate.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ặc self._cr là đối tượng con trỏ cơ sở dữ liệu; nó được sử dụng để truy vấn cơ sở dữ liệu

  • self.env.uid hoặc self._uid là id cơ sở dữ liệu của người dùng hiện tại

  • self.env.user là bản ghi của người dùng hiện tại

  • self.env.context hoặc self._context là từ điển ngữ cảnh

  • self.env.ref(xml_id) trả về bản ghi tương ứng với id XML

  • self.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.

Thẻ thuộc tính
  • các thẻ nên được thêm vào mô hình estate.property:

Assets

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()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ình estate.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:

Ưu đãi bất động sản

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 (res.partner)

yêu cầu

thuộc tính_id

Many2one (estate.property)

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_idstatus. 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ình estate.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 ;-)