2015-09-14 20 views
19

Tôi đã sử dụng trang trí @validates trong sqlalchemy.orm từ bình để xác thực các trường và tất cả đều ổn định miễn là tất cả các trường độc lập với nhau như:Bình xác nhận hợp đồng trang trí nhiều trường cùng một lúc

@validates('field_one') 
def validates_field_one(self, key, value): 
    #field one validation 

@validates('field_two') 
def validates_field_two(self, key, value): 
    #field two validation 

Tuy nhiên, bây giờ tôi cần thực hiện một số xác thực sẽ yêu cầu quyền truy cập vào field_one và field_two cùng một lúc. Dường như xác nhận chấp nhận nhiều đối số cho các xác nhận trang trí, tuy nhiên, nó sẽ chỉ đơn giản là chạy các chức năng xác nhận một lần cho mỗi đối số, như vậy:

@validates('field_one', 'field_two') 
def validates_fields(self, keys, values): 
    #field validation 

Kết quả trong một dòng chảy công việc của Validate field_one và sau đó xác nhận field_two. Tuy nhiên, tôi muốn xác nhận cả hai cùng một lúc (một ví dụ tầm thường trong đó sẽ được khẳng định rằng giá trị của field_one không phải là giá trị của field_two, một ví dụ trong đó sẽ không cho phép các vòng lặp tự trong một đồ thị trong đó field_one và field_two tham khảo các nút và nó đang thực hiện xác nhận trên một cạnh). Làm thế nào sẽ là cách tốt nhất để làm điều đó?

Trả lời

9

Đặt hàng các trường theo thứ tự chúng được xác định trên mô hình. Sau đó kiểm tra xem trường cuối cùng có phải là trường được xác thực hay không. Nếu không, chỉ cần trả lại giá trị không được chọn. Nếu trình xác thực hợp lệ hóa một trong các trường trước đó, một số trong số đó sẽ không được đặt.

@validates('field_one', 'field_two') 
def validates_fields(self, key, value): 
    if key == 'field_two': 
     assert self.field_one != value 
    return value 

Xem this example.

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