我想就我正在尝试解决的一项小任务询问一些指导方针。我正在试验一个使用 JSON 数据保存实体的小应用程序。
我知道您可以通过创建模型轻松地将字典转换为实体,但是,我正在尝试构建一种更通用的方法,将任何字典转换为实体。
我的步骤是:
- 得到字典。
- 通过读取类来验证 dict 键是否对应于实体模型定义。模型的字典。
- 尝试在模型类构造器中解压已验证的属性(创建模型实例)
- 把它返还。
到目前为止我还好,但缺乏我的 python 知识,要么限制我,要么让我困惑。也许我也忘记或不知道更简单的方法。
所以这里是:
@classmethod
def entity_from_dict(cls, parent_key, dict):
valid_properties = {}
logging.info(cls.__dict__)
for property,value in dict.iteritems():
if property in cls.__dict__: # should not iterate over functions, classmethods, and @property
logging.info(cls.__dict__[property]) # this outputs eg: StringProperty('title', required=True)
logging.info(type(cls.__dict__[property])) #this is more interesting <class 'google.appengine.ext.ndb.model.StringProperty'>
valid_properties.update({property: value})
# Update the id from the dict
if 'id' in dict: # if not creating a new entity
valid_properties['id'] = dict['id']
# Add the parent
valid_properties['parent'] = parent_key
#logging.info(valid_properties)
try:
entity = cls(**valid_properties)
except Exception as e:
logging.exception('Could not create entity \n' + repr(e))
return False
return entity
我的问题是我只想验证 ndb。属性而不是@classmethods,@property 也是如此,因为这会导致冲突。
我也在使用 expando 类,所以字典中任何额外的属性都会被存储。
如何检查这些特定类型?