谢谢回复~ 我测了一下你的方法两个时间信息都可以正确处理。
1.但是我的数据里包含有对其他表数据的pointer指向;你的代码我试了一下,pointer的那个字段其实是处理成了一个dict。
我准备手动检测一遍所有data
的元素若是dict且含有className
这个key则判断为是一个pointer关系,这时就再构建一个className
的Object、设置一下objectId,将其set进入obj中。
请问这样的思路是否可行?这样就能支持所有数据、简单的pointer关系了。我正在测试这个思路,测好了会把代码贴过来,方便以后其他人看。
=====更新代码=====
经过测试,这样处理过的数据从其中get出的pointer关系可以进行save()
操作,请@Proton点评,感谢~
def objectWithDict(self, className, data_dict):
"""根据className和data_dict构建一个leancloud.Object,可直接save()等操作,但ACL字段数据为空
"""
ClassType = leancloud.Object.extend(className)
obj = ClassType()
keysToPop = ['ACL']
pointerDict = {}
for key, value in data_dict.iteritems():
if type(value) == dict and 'className' in value: #该字段是pointer关系,重新构建一个新的Object重新set关系
SubObjType = leancloud.Object.extend(value['className'])
subObj = SubObjType()
subObj.set('objectId', value['objectId'])
pointerDict[key] = subObj
keysToPop.append(key)
[data_dict.pop(key, '') for key in keysToPop] #pop出所有pointer关系、和ACL字段数据
obj.set(data_dict) #赋值
[obj.set(k,v) for (k,v) in pointerDict.items()] #重新set所有pointer关系
return obj
2.关于ACL,由于客户端不需要这个信息,所以缓存数据里取出来没有是可以的;如果更新一条从Redis中取出的Object
不带ACL去执行save()
,那么旧有的数据ACL字段信息不会被覆盖成为默认的值吧?
3.关于pickle和json我从网上做了一些调查,cPickle主要是处理更快、处理完成后更小一些,如果对可读性、可移植性、安全性都没什么特殊要求,是可以的。我确实对这三方面没太大要求,如果日后需要移植,就将接口稍微改一下用json就可以,你觉得我这样想怎么样?