私が解決しようとしている小さなタスクについて、いくつかのガイドラインをお聞きしたいと思います。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 クラスも使用しているため、dict 内の余分なプロパティはすべて格納されます。
これらの特定のタイプを確認するにはどうすればよいですか?