我将我的一个项目传递给谷歌应用引擎,只是为了学习。但是我在使用ndb数据存储区时遇到了一些问题。我的根实体将是类别,并且这些实体具有子类别作为子实体。所以我要说我有类别 Foods ,它有子类别主菜。因此,此实体的关键是ndb.Key(Category, 'Foods', Subcategory, subcategoryId)
。当我从这个键创建一个查询对象时,我可以获取正确的子类别,但是从文档中我想做其他两个方法,这些方法都不起作用,我不知道是什么原因。
mySubcategorykey.get()
=>它使用上述密钥返回None。
Subcategory.get_by_id(subcategoryId)
=>也返回None。
当我从密钥生成safeUrl时,我无法使用ndb.Key(urlSafe=myUrlSafeString).get()
返回对象,但是打印ndb.Key(urlSafe)
会给我正确的密钥,因为它在 DataStore Viewer中声明
任何人都可以帮助我,告诉我我做错了什么?谢谢。
答案 0 :(得分:3)
这里有一些问题。
首先Subcategory.get_by_id(subcategoryId)
可能无效,因为示例键已定义了祖先。您需要在get_by_id
鉴于您使用的是mySubcategorykey.get()
且未检索到实体,则表示该密钥不正确。按键获取将不会经历最终的一致性,因此密钥是错误的,或者您没有放置()原始实体。
我建议您在放入()实体后查看密钥,看看它是否与您正在使用的实体相匹配。
你的示例键也存在问题,ndb.Key(Category, 'Foods', Subcategory, subcategoryId)
类别和子类别需要是字符串,或字符串值为“类别”和“子类别”的变量 - 这样写起来有点奇怪
此外,您不能从键创建查询对象,query
是ndb.Model的方法,或者您从ndb.Query
实例化查询对象。
所以你混淆了一些终结和/或概念。