在旧的 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=True”意味着“不允许写入值 None”,因此应该可以将其与默认值结合起来。请在 NDB 跟踪器中提交功能请求:http://code.google.com/p/appengine-ndb-experiment/issues/list
请注意,对于重复属性,事情会更加复杂,即使实现了上述功能,重复也可能继续与必需或默认不兼容。
我不确定其意图是什么,这是来自 appengine.ext.ndb.model.py
的“解释”请注意解释和行为发生了变化(2024 年 1 月 1 日左右,发布了repeated、required 和 default 选项是互斥的:repeated 属性不能是必需的,也不能指定默认值(默认值始终为空列表,空列表始终是允许的值),而 required 属性则不能 有默认值。
1.0.10 版本(1.8.9 SDK 版本))。查看最新的 appengine.ext.ndb.model.py:
repeated 和 required/default 选项是互斥的:repeated 属性不能是必需的,也不能指定默认值(默认值始终是空列表,空列表始终是允许的值),但是 required 属性请注意,ndb 还有一些其他非常烦人的行为(如果不对扩展模型进行猴子修补,则文本 >500 字节是不可能的,按 .IN( [] ) 过滤会引发异常,..)。 因此,除非您需要通过缓存来提高速度,否则您目前应该考虑使用可以 有默认值。
ext.db
。