2

私が解決しようとしている小さなタスクについて、いくつかのガイドラインをお聞きしたいと思います。JSON データを使用してエンティティを保存する小さなアプリを試しています。

モデルを作成するだけで辞書をエンティティに簡単に変換できることは知っていますが、辞書をエンティティに変換するより一般的なアプローチを構築しようとしています。

私の手順は次のとおりです。

  1. ディクテーションを取得します。
  2. クラスを読み取って、dict キーがエンティティ モデル定義に対応していることを検証します。モデルの口述。
  3. モデル クラス コンストラクターで検証済みのプロパティを展開してみてください (モデル インスタンスを作成します)。
  4. それを返します。

これまでのところ、私は大丈夫ですが、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 内の余分なプロパティはすべて格納されます。

これらの特定のタイプを確認するにはどうすればよいですか?

4

2 に答える 2