III. Xây dựng mô-đun – Building modules
6. Trường tính toán và giá trị mặc định
Cho đến nay các trường đã được lưu trữ trực tiếp và truy xuất trực tiếp từ cơ sở dữ liệu. Các trường cũng có thể được tính toán. Trong trường hợp đó, giá trị của trường không được lấy từ cơ sở dữ liệu mà được tính toán nhanh chóng bằng cách gọi một phương thức của mô hình.
Để tạo trường được tính toán, hãy tạo một trường và đặt compute thuộc tính của trường đó thành tên của một phương thức. Phương pháp tính toán chỉ cần đặt giá trị của trường để tính toán trên mọi bản ghi trong tự .
Nguy hiểm
self là một bộ sưu tập
Bản thân đối tượng là một tập hồ sơ, tức là một bộ sưu tập các bản ghi theo thứ tự. Nó hỗ
trợ các hoạt động Python tiêu chuẩn trên các bộ sưu tập, như len (self) và iter(self),cộng với các
hoạt động thiết lập thêm như recs1 + recs2.
Quay vòng trên bản thân cung cấp cho các bản ghi từng bản ghi một, trong đó mỗi bản ghi
chính nó là một bộ sưu tập kích thước 1. Bạn có thể truy cập/gán các trường trên một bản ghi bằng
cách sử dụng dấu chấm, chẳng hạn như record.name.
importrandom
fromodooimport models, fields, api classComputedModel(models.Model): _name = 'test.computed'
name = fields.Char(compute='_compute_name') def_compute_name(self):
for record in self:
record.name = str(random.randint(1, 1e6))
Phụ thuộc
Giá trị của trường được tính toán thường phụ thuộc vào giá trị của các trường khác trên bản ghi được tính toán. ORM hy vọng nhà phát triển sẽ chỉ định những phụ thuộc vào phương thức điện toán với bộ trang depends(). Các phụ thuộc nhất định được ORM sử dụng để kích hoạt tính toán lại trường bất cứ khi nào một số phụ thuộc của nó đã được sửa đổi:
classComputedModel(models.Model): _name = 'test.computed'
name = fields.Char(compute='_compute_name') value = fields.Integer()
@api.depends('value') def_compute_name(self): for record in self:
record.name = "Record with value %s" % record.value
Bài tập
Trường được tính toán
● Thêm tỷ lệ phần trăm số ghế đã lấy vào mô hình Phiên
● Hiển thị trường đó trong dạng xem dạng cây và biểu mẫu
● Hiển thị trường dưới dạng thanh tiến trình
Giá trị mặc định
Bất kỳ trường nào cũng có thể được cung cấp một giá trị mặc định. Trong định nghĩa trường, thêm tùy chọn default=X trong đó X là giá trị theo nghĩa đen Python (boolean, số nguyên, float, chuỗi) hoặc hàm lấy tập bản ghi và trả về giá trị:
name = fields.Char(default="Unknown")
user_id = fields.Many2one('res.users', default=lambdaself: self.env.user)
Ghi chú
Đối tượng self.env cho phép 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 đối tượngcon trỏ cơ sở dữ liệu; nó được sử dụng để truy vấn
cơ sở dữ liệu
● self.env.uid hoặcself._uidid 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._contextlà 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 thể hiện của mô hình đã cho
Bài tập
Đối tượng hiện hoạt – Giá trị mặc định
● Xác định giá start_date mặc định như hôm nay (xem Date).
● Thêm trường hoạt động trong Phiên lớp học và đặt phiên hoạt động theo mặc định.
Cơ chế "onchange" cung cấp một cách để giao diện máy khách cập nhật biểu mẫu bất cứ khi nào người dùng đã điền vào một giá trị trong một trường mà không lưu bất cứ thứ gì vào cơ sở dữ liệu.
Ví dụ: giả sử một mô hình có ba trường số tiền , unit price và giá và bạn muốn cập nhật giá trên biểu mẫu khi bất kỳ trường nào khác được sửa đổi. Để đạt được điều này, hãy xác định một phương thức trong đó tự đại diện cho bản ghi trong dạng xem biểu mẫu và trang trí nó bằng onchange() để chỉ định trường nào nó phải được kích hoạt. Bất kỳ thay đổi nào bạn thực hiện trên bản thân sẽ được phản ánh trên biểu mẫu.
<!-- content of form view -->
<fieldname="amount"/> <fieldname="unit_price"/>
<fieldname="price"readonly="1"/>
# onchange handler
@api.onchange('amount', 'unit_price') def_onchange_price(self):
# set auto-changing field
self.price = self.amount * self.unit_price # Can optionally return a warning and domains
return { 'warning': {
'title': "Something bad happened", 'message': "It was very bad indeed", }
}
Đối với các trường được tính toán, hành vi onchange có giá trị được tích hợp sẵn như có thể thấy bằng cách chơi với biểu mẫu Phiên: thay đổi số lượng chỗ ngồi hoặc người tham gia và thanh tiến trình taken_seats được tự động cập nhật.
Bài tập
Cảnh báo
Thêm một sự thay đổi rõ ràng để cảnh báo về các giá trị không hợp lệ, chẳng hạn như số ghế âm hoặc nhiều người tham gia hơn chỗ ngồi.