若不存入数据存储区,ndb.Model属性能否命名为‘key’?
能否在不存入Datastore的NDB模型中使用保留名"key"作为属性?
答案是可以,但有几个关键细节需要你留意:
- NDB文档警告不要用"key"作为属性名,本质是因为当模型实例被持久化到Datastore时,NDB会自动为每个实体生成一个内置的
key属性(用来唯一标识实体在存储中的位置)。如果你的自定义属性也叫这个名字,会和系统内置的key产生命名冲突,导致存储、读取数据时出现异常。 - 但如果你的
Setting和MessageSettings实例永远不会被存入Datastore——也就是你只把它们当作结构化的数据容器来用,完全不调用put()方法,也不会通过NDB的查询接口加载这些模型——那这个命名冲突的场景就不会出现。此时NDB不会为这些实例生成内置的key属性,你的自定义key属性只会作为普通的模型属性存在,完全不会有问题。
不过这里给你提个务实的建议:就算现在没打算持久化,难保以后需求变更会想把这些模型存入Datastore。到时候如果忘了修改属性名,很容易踩坑。所以如果条件允许,建议换个更明确的名字,比如setting_key或者config_key,既避免了潜在的冲突,代码可读性也更强。
你可以简单验证一下这个行为:
s = Setting(key="notification", name="Enable Notifications", value=True) print(s.key) # 这里会输出你设置的"notification",而非NDB的Key对象
只要不调用s.put(),这个逻辑就一直是正常的。
内容的提问来源于stack exchange,提问作者Nickolas Kraus
相关产品推荐
相关产品推荐

