如何使用jsonpickle排除序列化的特定字段?

mku*_*ayk 14 python json sqlalchemy jsonpickle flask

我正在使用Flask的SQLAlchemy扩展.在使用jsonpickle 序列化我的模型(也用于数据库操作)时,我想要忽略一些特定的属性.有没有办法让我设定这些规则?

SQLAlchemy添加了一个名为_sa_instance_state该对象的属性.总之,我不希望这个字段在JSON输出中.

Mar*_*ers 18

您不能告诉默认的类选择器忽略某些东西,不.

jsonpickle 确实支持pickle模块 __getstate____setstate__方法.如果您的类实现了这两个方法,则返回的任何内容将用于jsonpickle表示状态.这两种方法都需要实施.

如果__getstate__实现的,jsonpickle使用__dict__属性代替,所以你自己的版本只需要使用相同的字典,删除_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)
Run Code Online (Sandbox Code Playgroud)

无论何种__getstate__返回都将以递归方式进一步处理,因此无需担心在那里处理子对象.

如果添加__getstate__并且__setstate__不是选项,您还可以为您的类注册自定义序列化处理程序 ; 缺点是虽然__getstate__只是返回一个字典就可以逃脱,但是自定义处理程序需要返回一个完全展平的值.

  • 现在,添加`__getstate__`和`__setstate__`就像是一种魅力,谢谢。代替为每个模型编写相同的代码行,实现一个装饰器以从__dict__移除被忽略的字段可能对将来是个好主意。 (2认同)