对象如下所示
{
"id":1,
"image":"path/to/image",
"employee_data":<sql_alcahmy_object>,
}
再次sql_alcahmy_object如下
{
"employee_previous":<sql_alchemy_object2>,
"employee_salary":"1$",
}
再次sql_alcahmy_object2如下
{"company":"xyz","years":10}
以下方法将用于从sql炼金术对象中提取所有数据
sql_alchemy_object.__dict__
下面是计划的递归方法,但没有解决
def extract_recursive(deepvalue,alldata={}):
for eachkey,eachvalue in deepvalue.__dict__.iteritems():
if hasattr(eachvalue,"__dict__"):
alldata.update({eachkey:extract_recursive(eachvalue)})
else:
alldata.update({eachkey:eachvalue})
print(alldata)
预期产量
{
"id":1,
"image":"path/to/image",
"employee_data":{
"employee_previous":{"company":"xyz","years":10},
"employee_salary":"1$",
}
}
如下所示的deepvalue和sql_alcahmy_object中可用的方法
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__mapper__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__table__', '__tablename__', '__weakref__', '_decl_class_registry', '_sa_class_manager', 'age']
答案 0 :(得分:0)
这里的__dict__
有一个误解
实际上是
用于存储对象(可写)属性的字典或其他映射对象。
但是它不允许访问字典的嵌套字典。
因此,如果要遍历字典中的项目,只需调用thedict.iteritems()
而不是thedict.__dict__.iteritems()
。
然后,如果要检查变量是否包含dict
实例,请使用isinstance(a_dict, dict)
,而不要使用hasattr(a_dict, '__dict__')
。
此外,使用可变对象作为函数参数的默认值可能会产生非直觉的结果,因此强烈建议不要这样做(请参阅"Least Astonishment" and the Mutable Default Argument)
相反,您可能应该传递None
作为默认值,并在函数开始时添加一个alldata = alldata or {}
。
最后,尽管我不了解您的功能要点,但是此版本应该更好地工作:
def extract_recursive(deepvalue, alldata=None):
alldata = alldata or {}
for eachkey, eachvalue in deepvalue.iteritems():
if isinstance(eachvalue, dict):
alldata.update({eachkey:extract_recursive(eachvalue)})
else:
alldata.update({eachkey:eachvalue})
print(alldata)