我正在使用Flask的SQLAlchemy扩展。在使用jsonpickle序列化我的模型(也用于数据库操作)时,我想要忽略一些特定的属性。有没有办法让我设定这些规则?
SQLAlchemy将一个名为_sa_instance_state
的属性添加到对象中。总之,我不希望这个字段在JSON输出中。
答案 0 :(得分:16)
你不能告诉默认的类选择器忽略某些东西,没有。
jsonpickle
支持pickle
module __getstate__
和__setstate__
方法。如果您的类实现了这两个方法,则jsonpickle
将使用返回的任何内容来代表状态。这两种方法都需要实施。
如果__getstate__
未实现 ,则jsonpickle
会使用__dict__
属性,因此您自己的版本只需要使用相同的字典,删除{ {1}}密钥,您完成了:
_sa_instance_state
无论def __getstate__(self):
state = self.__dict__.copy()
del state['_sa_instance_state']
return state
def __setstate__(self, state):
self.__dict__.update(state)
返回是否会以递归方式进一步处理,都无需担心在那里处理子对象。
如果无法添加__getstate__
和__getstate__
,您还可以为您的班级注册custom serialization handler;缺点是虽然__setstate__
只能返回一个字典,但自定义处理程序需要返回一个完全展平的值。
答案 1 :(得分:0)
这将帮助其他人完成任务:
在像您的自定义jsonpickle
包这样的包中制作一个像这样的类:
class SetGetState:
def __getstate__(self):
state = self.__dict__.copy()
try:
class_name = '_' + self.__class__.__name__ + '__'
new_items = {key:value for key, value in state.items() if class_name not in key}
return new_items
except KeyError:
pass
return state
并在类中继承该类,不需要私有属性序列化
class Availability(jsonpickle.SetGetState):
pass