为什么ndb中required和default是互斥的?

问题描述 投票:0回答:2

在旧的 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()方法。我仍然不明白为什么必需的和默认的是相互排斥的。

这是错误还是功能?

python google-app-engine google-cloud-datastore app-engine-ndb
2个回答
12
投票

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

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


1
投票

我不确定其意图是什么,这是来自 appengine.ext.ndb.model.py

的“解释”

repeated、required 和 default 选项是互斥的:repeated 属性不能是必需的,也不能指定默认值(默认值始终为空列表,空列表始终是允许的值),而 required 属性则不能 有默认值。

请注意解释和行为发生了变化(2024 年 1 月 1 日左右,发布了

1.0.10 版本(1.8.9 SDK 版本))。查看最新的 appengine.ext.ndb.model.py:

repeated 和 required/default 选项是互斥的:repeated 属性不能是必需的,也不能指定默认值(默认值始终是空列表,空列表始终是允许的值),但是 required 属性

可以 有默认值。

请注意,ndb 还有一些其他非常烦人的行为(如果不对扩展模型进行猴子修补,则文本 >500 字节是不可能的,按 .IN( [] ) 过滤会引发异常,..)。 因此,除非您需要通过缓存来提高速度,否则您目前应该考虑使用

ext.db

© www.soinside.com 2019 - 2024. All rights reserved.