2017-12-11 20 views
2

私は、Google App Engine、Python 2.7、標準環境で、ndbデータストアを使って作業しています。私はいくつかのNDBモデルをいくつか更新していますが、アップデートの1つでは、 "レストラン"モデルに新しいプロパティ(浮動小数点数)を追加する必要があります。このデフォルト値のGoogle App Engine NDB FloatPropertyのデフォルト値が機能していませんか?

class Restaurant(ndb.Model): 
    ... some properties ... 
    resto_fullresyncstamp = ndb.FloatProperty(default=0.0) 

私の理解だった:私はモデルにプロパティを追加するために必要なてきたとき、過去に、私はいつもNDBは、モデルを定義するときには次のようにあなたは、デフォルト値を指定することができますどのように言っていましたエンティティがデータストアからフェッチされたときに、特定のエンティティのresto_fullresyncstampプロパティがない場合、モデルのローカルコピーにデフォルトの値が追加されます。そうすれば、すべてがNoneであるかどうかをチェックする必要はなく、プロパティが常に自分のコードに値を持つと見なすことができます。だから私は...このよう

lastsync = ... 
resto = Restaurant.query()....get() 
if not resto: 
    logging.warning("Failed to get restauraunt: %s" % username) 
    self.error(404) 
    return 

if lastsync != 0.0 and resto.resto_fullresyncstamp > lastsync: 
    logging.warning("Requiring client to perform full resynchronization") 
    self.error(510) 
    return 

を何かを行うことができる...と「resto_fullresyncstampは」私のモデルで新しいプロパティで、特定のレストランでは、そのプロパティセットがなかった場合でも、ことを期待してください明示的にどこでも、私はまだ比較する有効な(0.0)値を取得します。私は実際に取得しています何

は、このエラーメッセージです:

Traceback (most recent call last): 
.... 
File "/base/data/home/apps/s~virt-som/1.406133528491612487/virtsom.py", line 5399, in post 
if lastsync != 0.0 and resto.resto_fullresyncstamp > lastsync: 

AttributeError: 'Restaurant' object has no attribute 'resto_fullresyncstamp' 

はこの作品べきではないのですか?私は年齢の間、NDBで働いていましたが、これまでのように私のモデルでは "default"パラメータを使用しました。何か不足していますか?

答えて

0

これは動作しません。

既存のモデルに新しいプロパティを追加するときは、そのプロパティを取得するために古いエンティティを再度データストアに配置する必要があります。デフォルト値が何であってもそれを取得する。

+0

よく@janscas、手動で値を割り当ててプロパティを追加すると、問題が解決されたようですが、 "default"パラメータの目的は何ですか?プロパティに「デフォルト」の値を指定し、そのプロパティを使用する前に手動でプロパティの値を割り当てる必要があるのはなぜですか?これは、 "デフォルト"のパラメータを無用にするよりも悪くし、誤解を招くようにします。また、Googleのドキュメントも間違っています。[この記事](例:https://cloud.google.com/appengine/articles/update_schema)は、まさに私がやろうとしていることです。 –

+0

デフォルトのパラメータは、それが何をしているかを行います。設定しないと、デフォルトに設定されます。しかし、モデルを変更した後に保存したすべてのエンティティでのみ有効です。 – janscas

+0

申し訳ありません@janscasですが、この記事[https://cloud.google.com/appengine/articles/update_schema]はまさに私がやろうとしていることであり、エンティティに新しいフィールドを追加すると、データストアに既に保存されている、この新しいフィールドを持たないエンティティが存在します。記事を直接引用するには、次のようになります。「Datastoreから画像を読み込むと、num_votesとavg_ratingがデータストアの値またはモデルで指定されたデフォルト値のいずれかに設定されます。これは私が期待しているものであり、APIの最新バージョンでは機能しません。 –

関連する問題