2013-08-09 43 views
10

Tôi đang sử dụng phần mở rộng SQLAlchemy với Flask. Trong khi tuần tự hóa các mô hình của tôi (cũng được sử dụng cho hoạt động cơ sở dữ liệu) bằng cách sử dụng jsonpickle, tôi muốn một số thuộc tính cụ thể bị bỏ qua. Có cách nào cho phép tôi thiết lập các quy tắc đó không?Làm thế nào để loại trừ các trường cụ thể về tuần tự hóa với jsonpickle?

SQLAlchemy thêm thuộc tính có tên _sa_instance_state vào đối tượng. Trong một từ, tôi không muốn trường này nằm trong đầu ra JSON.

Trả lời

8

Bạn không thể yêu cầu trình chọn lớp mặc định bỏ qua thứ gì đó, không.

jsonpicklekhông hỗ trợ pickle module__getstate____setstate__ phương pháp. Nếu các lớp của bạn thực hiện hai phương thức đó, thì bất kỳ thứ gì được trả lại sau đó được sử dụng bởi jsonpickle để đại diện cho trạng thái thay thế. Cả hai phương pháp đều cần phải được thực hiện.

Nếu __getstate__không thực hiện, jsonpickle sử dụng thuộc tính __dict__ thay thế, do phiên bản của riêng bạn chỉ cần sử dụng từ điển cùng, loại bỏ phím _sa_instance_state và bạn đang thực hiện:

def __getstate__(self): 
    state = self.__dict__.copy() 
    del state['_sa_instance_state'] 
    return state 

def __setstate__(self, state): 
    self.__dict__.update(state) 

__getstate__ lợi nhuận sẽ được xử lý thêm, đệ quy, không cần phải lo lắng về việc xử lý các subobject ở đó.

Nếu thêm __getstate____setstate__ không phải là tùy chọn, bạn cũng có thể đăng ký custom serialization handler cho lớp học của mình; bất lợi là trong khi __getstate__ có thể lấy đi chỉ bằng cách trả về một từ điển, một trình xử lý tùy chỉnh sẽ cần phải trả về một giá trị được làm phẳng hoàn toàn.

+1

Thêm '__getstate__' và' __setstate__' hoạt động như một sự quyến rũ hiện tại, cảm ơn bạn. Thay vì viết cùng một dòng mã cho mỗi mô hình, việc triển khai một trình trang trí để xóa các trường bị bỏ qua khỏi '__dict__' có thể là một ý tưởng hay cho tương lai. – mkubilayk

+0

Thứ hai, thứ mà mkubilayk mong muốn cho một tính năng trong tương lai, nó sẽ rất giống với xml serialization của Xml [XmlAttributes.XmlIgnore Property] (https://msdn.microsoft.com/en-us/library/system.xml.serialization .xmlattributes.xmlignore (v = vs.110) .aspx) – jxramos

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