Thông thường cả hai trình bày deco đều được sử dụng để trang trí phương thức kiểu bản ghi trong đó 'self
' chứa recordset (s). Hãy để tôi giải thích ngắn gọn khi sử dụng @api.one
và @api.multi
:
1.@api.one
:
Trang trí một phương pháp kỷ phong cách nơi 'tự' được kỳ vọng sẽ là một ví dụ singleton.
Phương pháp trang trí tự động lặp lại trên hồ sơ (nghĩa là, đối với mỗi bản ghi trong bộ sưu tập mà nó gọi phương thức) và tạo danh sách có kết quả.
Trong trường hợp phương pháp được trang trí bằng @returns, nó sẽ kết hợp các phiên bản kết quả. một phương pháp như:
@ api.one phương pháp def (tự, args): trở self.name
có thể được gọi trong cả hai kỷ lục và truyền thống phong cách, giống như ::
# recs = model.browse(cr, uid, ids, context)
names = recs.method(args)
names = model.method(cr, uid, ids, args, context=context)
- Mỗi lần 'tự' được định nghĩa lại là bản ghi hiện tại.
2.@api.multi
:
Trang trí một phương pháp kỷ phong cách nơi 'self
' là một recordset. Phương thức này thường định nghĩa một thao tác trên các bản ghi. một phương pháp như:
@ api.multi phương pháp def (tự, args):
có thể được gọi trong cả hai kỷ lục và truyền thống phong cách, giống như ::
# recs = model.browse(cr, uid, ids, context)
recs.method(args)
model.method(cr, uid, ids, args, context=context)
Khi để sử dụng:
Nếu bạn đang sử dụng @ api.one, retu giá trị rned nằm trong danh sách. Điều này không phải lúc nào cũng được ứng dụng web hỗ trợ, ví dụ: trên nút hành động phương pháp. Trong trường hợp đó, bạn nên sử dụng @api.đa để trang trí phương thức của bạn và có thể gọi self.ensure_one() trong định nghĩa phương thức.
Luôn sử dụng tốt hơn @ api.multi với self.ensure_one() thay vì @ api.one để tránh tác dụng phụ trong giá trị trả lại.
Chừng nào tôi nhìn thấy trang trí phương pháp cho phép để xác định thông tin ngữ nghĩa như thế nào bạn đang xử lý hồ sơ bên trong. Về điểm "khi nào cần sử dụng api.multi". Tiêu chí này có dựa trên hỗ trợ webclient không? Vấn đề này không thể được giải quyết thông qua api.return trong tất cả các trường hợp? Tôi thấy cách chúng tôi hy sinh thông tin ngữ nghĩa có thể hữu ích cho ORM để thực hiện tối ưu hóa và quyết định các cuộc gọi thích hợp. Tôi nghĩ rằng nó giống như sử dụng ngày càng nhiều câu lệnh SQL khi ORM không hỗ trợ một số hoạt động thay vì cải thiện nó. – yucer
@BomberMan Cảm ơn bạn đã giải thích chi tiết! Điều đó giải quyết bí ẩn của tôi :) Tôi đã tự hỏi tại sao tôi nhận được một danh sách từ phương pháp của tôi :) – IstaLibera
Câu trả lời hay! Chỉ muốn thêm @ api.one đó không còn được dùng kể từ phiên bản v9.0 (https://www.odoo.com/documentation/10.0/reference/orm.html#module-odoo.api) – Fractalf