11

在旧的 google appengine 数据存储 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 而不必指定一个值。我还想避免有人将该值覆盖为无。上面的例子是构造的。我可能没有必需的属性,而是添加一个 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 还有其他一些非常烦人的行为( Text>500 Bytes not possible without monkey-patching the expando-model, 通过 .IN( [] ) 过滤会引发异常,..)。因此,除非您需要通过缓存来提高速度,否则您应该考虑使用 ext.db atm。

于 2013-01-09T09:13:40.063 回答