11

古いGoogleAppEngineデータストアAPIでは、「必須」と「デフォルト」をプロパティ定義に一緒に使用できました。ndbを使用すると、

ValueError: repeated, required and default are mutally exclusive.

サンプルコード:

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)

値を指定せずにCounterをインスタンス化したい。また、誰かがその値をNoneにオーバーライドすることを避けたいと思います。上記の例を作成します。おそらく、必須の属性がなくても、increment()メソッドを追加することができます。それでも、requiredとdefaultが相互に排他的である理由はわかりません。

それはバグですか、それとも機能ですか?

4

2 に答える 2

11

私はあなたが正しいと思います。コードのその部分を書いているとき、おそらく私は混乱していました。「required=True」は「値Noneの書き込みを許可しない」を意味するので、これをデフォルト値と組み合わせることができるはずです。NDBトラッカーに機能リクエストを提出してください:http ://code.google.com/p/appengine-ndb-experiment/issues/list

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

于 2013-01-10T17:36:56.857 に答える
0

何が意図されているのかわかりません。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には他にも非常に厄介な動作があることに注意してください(expando-modelにモンキーパッチを適用しないとText> 500 Bytesは不可能であり、.IN([])でフィルタリングすると例外が発生します..)。したがって、キャッシングによる速度の向上が必要でない限り、ext.dbatmを使用することを検討する必要があります。

于 2013-01-09T09:13:40.063 に答える