2015-01-16 21 views

Trả lời

15

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@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:

  1. 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.

  2. 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.

+0

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

+0

@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

+0

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

3

@ api.one:

trang trí này lặp tự động trên hồ sơ của RecordSet cho bạn. Tự được định nghĩa lại như kỷ lục hiện tại:

@api.one 
def func(self): 
    self.name = 'xyz' 

@ api.multi:

tự sẽ là RecordSet hiện tại mà không lặp lại. Đây là hành vi mặc định:

@api.multi 
def func(self): 
    len(self) 

Đối với mô tả chi tiết của tất cả các API bạn có thể tham khảo này Link

0
@api.model #When the record data/self is not as relevant. Sometimes also used with old API calls. 
def model_text(self): 
    return "this text does not rely on self" 

@api.multi #Normally followed by a loop on self because self may contain multiple records 
def set_field(self): 
    for r in self: 
     r.abc = r.a + r.b 

@api.one #The api will do a loop and call the method for each record. Not preferred because of potential problems with returns to web clients 
def set_field(self): 
    self.abc = self.a + self.b 
+0

Hãy cố gắng tránh chỉ trích xuất mã như một câu trả lời và cố gắng giải thích những gì nó làm và tại sao. Mã của bạn có thể không hiển nhiên đối với những người không có trải nghiệm mã hóa có liên quan. – Frits

Các vấn đề liên quan