2017-07-06 9 views
0

Google Cloud ndbとRESTアーキテクチャを使用してCRUDアプリケーションを作成しようとしています。キーでNDBエンティティをエンコードするJSON

したがって、私は作成と取得のために異なるAPI呼び出しを持っています。

エンティティを更新するには、それらをフロントエンドに表示する必要がありますが、識別子も指定する必要があります。したがって、ndbは後で更新するエンティティを認識します。

私はmodel.queryでエンティティを取得しようとし、その後datetimendb.Keyをシリアル化するために拡張されたエンコーダとJSONにそれらをエンコード:

# JSONEncoder extension to handle datetime & ndb.Key 
class CustomJsonEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, datetime): 
      return obj.strftime('%Y-%m-%d-%H-%M-%S') 
     if isinstance(obj, ndb.Key): 
      return obj.urlsafe() 
     return json.JSONEncoder.default(self, obj) 

# Get JSON data from ndb 
query = Card.query(Card.category==category, ancestor=ancestor_key()).fetch() 
cards = json.dumps([c.to_dict() for c in query], cls=CustomJsonEncoder) 
       self.response.headers['Content-Type'] = 'application/json' 
       self.response.out.write(cards) 

私の問題は、現在のエンティティのキ​​ーがちょうど消えると示されていないということですjson.dumpにはもうありません。私は何の誤りもなく、それは単にコード化されておらず、渡されているだけです。

datetimeオブジェクトは、印刷すると正しく表示されます。 json.dumpと一緒にURL安全なndbキーをどのように送信できるかについてのアイデアはありますか?

答えて

0

ではないCardエンティティオブジェクトをダンプしています。にはそれぞれのオブジェクトキーが含まれています。これを確認するには、単に一時的にCustomJsonEncoderに、このようなログステートメントを追加します。

  if isinstance(obj, ndb.Key): 
       logging.error('key found: %s' % obj.urlsafe()) 
       return obj.urlsafe() 

を明示的にあなたがそれらをしたい場合はJSONエンコードするデータにエンティティキーを追加する必要があります。

それとも、そのエンティティのモデルでComputedPropertyを使用することができます(ただし、あなたは、いくつかのストレージを無駄にすることだろう):

key_str = ndb.ComputedProperty(lambda self: self.key.urlsafe()) 
関連する問題