9

古いGoogle App Engineのdatastore APIでは、プロパティ定義に「必須」と「デフォルト」を一緒に使用できます。なぜ必須で、デフォルトはndbでは排他的ですか?

from google.appengine.ext import ndb 
from google.appengine.ext import db 

class NdbCounter(ndb.Model): 
    # raises ValueError 
    count = ndb.IntegerProperty(required=True, default=1) 

class DbCounter(db.Model): 
    # Doesn't raise ValueError 
    count = db.IntegerProperty(required=True, default=1) 

は私が値を指定せずにカウンターをインスタンス化したい:NDBを使用して、私は

ValueError: repeated, required and default are mutally exclusive. 

サンプル・コードを取得します。私はまた、その値をNoneに上書きする誰かを避けたい。上記の例が構築されます。私はおそらく必要な属性なしで生活し、代わりにインクリメント()メソッドを追加することができます。依然として、必須とデフォルトが相互排他的である理由はわかりません。

バグですか?機能ですか?

答えて

10

あなたは正しいと思います。多分私はコードのその部分を書くとき混乱しました。 "required = True"は "None"という値を書くことを許さないということを意味するので、これをデフォルト値と組み合わせることができるはずです。 http://code.google.com/p/appengine-ndb-experiment/issues/list

上記の機能が実装されていても、繰り返されるプロパティは複雑であり、繰り返しはおそらく必須またはデフォルトと互換性がない可能性があることに注意してください。

+0

ありがとうございます。問題を作成しました。http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=236 – bastian

0

イムではないことを意図したものを確認してくださいは、HERESにappengine.ext.ndb.model.pyから「説明」である:

The repeated, required and default options are mutually exclusive: a 
repeated property cannot be required nor can it specify a default 
value (the default is always an empty list and an empty list is always 
an allowed value), and a required property cannot have a default. 

NDBは、他のいくつかの本当に迷惑行動(テキスト> 500バイトではないを持っていることに注意してくださいexpando-modelをmonkey-patchingせずに.IN([])でフィルタリングすると、例外が発生します。 キャッシングによる速度向上が必要な場合を除き、ext.db atmのままにしておいてください。

+0

これは概念的なバグだと思われます。私はこの制限の理由を見ません。 required = Trueの場合、defaultはNoneにすることはできません。 – bastian

+0

私にはそれはそのまま意味があります。値が必要な場合は、そのような場合にはrequired = Trueを指定しないようにデフォルトを指定するのはなぜですか(他に何もしませんが、デフォルトを持つモデルを作成して保存する場合と同じです)。 required = Trueは、このフィールドに値を指定せずにこのモデルを保存しようとすると失敗しますが、デフォルトを指定すると保存に失敗することはなく、私の場合はポイントになります必要とされる –

関連する問題