Tài liệu ràng buộc Python

Giới thiệu khả năng thêm một số logic nghiệp vụ vào mô hình của chúng tôi. Bây giờ chúng tôi có thể liên kết các nút với mã doanh nghiệp, nhưng làm cách nào để ngăn người dùng nhập dữ liệu không chính xác?

Odoo cung cấp hai cách để thiết lập các bất biến được xác minh tự động. và SQL constraints

SQL

Thẩm quyền giải quyết. tài liệu liên quan đến chủ đề này có thể được tìm thấy trong và trong tài liệu của PostgreSQL

Ghi chú

Mục tiêu. ở cuối phần này

  • Số tiền phải (đúng) dương

Tài liệu ràng buộc Python
  • Các loại thuộc tính và thẻ phải có một tên duy nhất

Tài liệu ràng buộc Python

Các ràng buộc SQL được xác định thông qua thuộc tính mô hình _sql_constraints. Thuộc tính này được gán một danh sách các bộ ba chứa chuỗi (name, sql_definition, message), trong đó name là tên ràng buộc SQL hợp lệ, sql_definition là biểu thức ràng buộc bảng và message là thông báo lỗi

Bạn có thể tìm thấy một ví dụ đơn giản

Bài tập

Thêm các ràng buộc SQL

Thêm các ràng buộc sau vào các mô hình tương ứng của chúng

  • Giá dự kiến ​​​​của một tài sản phải hoàn toàn tích cực

  • Giá bán bất động sản phải dương

  • Giá chào bán phải hoàn toàn tích cực

  • Tên thẻ thuộc tính và tên loại thuộc tính phải là duy nhất

Mẹo. tìm kiếm từ khóa unique trong cơ sở mã Odoo để biết các ví dụ về tên duy nhất

Khởi động lại máy chủ với tùy chọn

from odoo.exceptions import ValidationError

...

@api.constrains('date_end')
def _check_date_end(self):
    for record in self:
        if record.date_end < fields.Date.today():
            raise ValidationError("The end date cannot be set in the past")
    # all records passed the test, don't return anything
0 để xem kết quả. Lưu ý rằng bạn có thể có dữ liệu ngăn không cho đặt ràng buộc SQL. Một thông báo lỗi tương tự như sau có thể bật lên

ERROR rd-demo odoo.schema: Table 'estate_property_offer': unable to add constraint 'estate_property_offer_check_price' as CHECK(price > 0)

Ví dụ: nếu một số ưu đãi có giá bằng 0 thì không thể áp dụng ràng buộc. Bạn có thể xóa dữ liệu có vấn đề để áp dụng các ràng buộc mới

con trăn

Thẩm quyền giải quyết. các tài liệu liên quan đến chủ đề này có thể được tìm thấy trong

Ghi chú

Mục tiêu. ở cuối phần này, sẽ không thể chấp nhận một đề nghị thấp hơn 90% giá dự kiến

Tài liệu ràng buộc Python

Các ràng buộc SQL là một cách hiệu quả để đảm bảo tính nhất quán của dữ liệu. Tuy nhiên, có thể cần thực hiện các kiểm tra phức tạp hơn yêu cầu mã Python. Trong trường hợp này, chúng ta cần một ràng buộc Python

Một ràng buộc Python được định nghĩa là một phương thức được trang trí bằng và được gọi trên một tập bản ghi. Trình trang trí chỉ định trường nào có liên quan đến ràng buộc. Ràng buộc được đánh giá tự động khi bất kỳ trường nào trong số này được sửa đổi. Phương pháp dự kiến ​​​​sẽ đưa ra một ngoại lệ nếu bất biến của nó không được thỏa mãn

from odoo.exceptions import ValidationError

...

@api.constrains('date_end')
def _check_date_end(self):
    for record in self:
        if record.date_end < fields.Date.today():
            raise ValidationError("The end date cannot be set in the past")
    # all records passed the test, don't return anything

Một ví dụ đơn giản có thể được tìm thấy

Bài tập

Thêm các ràng buộc Python

Thêm ràng buộc để giá bán không được thấp hơn 90% giá dự kiến

Mẹo. giá bán bằng 0 cho đến khi một ưu đãi được xác thực. Bạn sẽ cần tinh chỉnh séc của mình để tính đến điều này

Cảnh báo

Luôn sử dụng các phương thức

from odoo.exceptions import ValidationError

...

@api.constrains('date_end')
def _check_date_end(self):
    for record in self:
        if record.date_end < fields.Date.today():
            raise ValidationError("The end date cannot be set in the past")
    # all records passed the test, don't return anything
3 và
from odoo.exceptions import ValidationError

...

@api.constrains('date_end')
def _check_date_end(self):
    for record in self:
        if record.date_end < fields.Date.today():
            raise ValidationError("The end date cannot be set in the past")
    # all records passed the test, don't return anything
4 từ
from odoo.exceptions import ValidationError

...

@api.constrains('date_end')
def _check_date_end(self):
    for record in self:
        if record.date_end < fields.Date.today():
            raise ValidationError("The end date cannot be set in the past")
    # all records passed the test, don't return anything
5 khi làm việc với số float

Đảm bảo ràng buộc được kích hoạt mỗi khi giá bán hoặc giá dự kiến ​​thay đổi

Các ràng buộc SQL thường hiệu quả hơn các ràng buộc Python. Khi hiệu suất quan trọng, hãy luôn ưu tiên SQL hơn các ràng buộc của Python

Mô-đun bất động sản của chúng tôi đang bắt đầu hoạt động tốt. Chúng tôi đã thêm một số logic kinh doanh và bây giờ chúng tôi đảm bảo dữ liệu nhất quán. Tuy nhiên, giao diện người dùng vẫn còn hơi thô. Hãy xem làm thế nào chúng ta có thể cải thiện nó trong

Các ràng buộc trong Python là gì?

Ràng buộc python là gì? . a module implementing support for handling CSPs (Constraint Solving Problems) over finite domain.

Trình giải quyết ràng buộc cho Python là gì?

Mô-đun ràng buộc Python cung cấp bộ giải cho các Bài toán thỏa mãn ràng buộc (CSP) trên các miền hữu hạn bằng Python đơn giản và thuần túy . CSP là lớp các bài toán có thể được biểu diễn dưới dạng các biến (a, b,…), miền (a trong [1, 2, 3],…) và các ràng buộc (a < b,…).

Trình giải quyết ràng buộc là gì?

Các hạn chế được xây dựng dưới dạng các ràng buộc giúp gán giá trị cho một biến tùy ý. Bộ giải ràng buộc có thể truyền các hệ quả của việc gán cho các biến khác và thứ tự của các phép gán biến không ảnh hưởng đến các ràng buộc .