为什么要求和默认在ndb中是互斥的?

时间:2013-01-09 08:30:36

标签: python google-app-engine google-cloud-datastore app-engine-ndb

在旧的google appengine数据存储区API中,“required”和“default”可以一起用于属性定义。使用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()方法。我仍然没有看到为什么要求和默认是相互排斥的原因。

是错误还是功能?

2 个答案:

答案 0 :(得分:10)

我认为你是对的。当我编写代码的那部分时,也许我很困惑。有意义的是,“required = True”表示“不允许写入值None”,因此应该可以将其与默认值组合。请在NDB跟踪器中提交功能请求:http://code.google.com/p/appengine-ndb-experiment/issues/list

请注意,对于重复的属性,事情会更复杂,即使实现了上述功能,重复也可能继续与required或default不兼容。

答案 1 :(得分: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模型,则文本> 500字节不可能,通过.IN([])过滤会引发异常,...)。 因此,除非您需要通过缓存来提高速度,否则您应该考虑使用ext.db atm。