Google app engine db.Key.from_path()未返回正确的密钥

Google app engine db.Key.from_path()未返回正确的密钥,google-app-engine,Google App Engine,我在代码中的几个不同位置使用db.Key.from_path(Model,Key_name),然后调用db.get()或Model.get by_Key_name()。我注意到后一个命令总是返回0个项目,即使我确信我应该返回一些东西。仔细检查后,我注意到db.Key.from_path()命令没有返回正确的键。返回的键看起来非常相似,特别是在开始时,但某些字符不同,它比数据存储查看器中显示的键短约75%。还有其他人遇到过这种情况吗?谢谢 以下是一些示例代码: class Root(db.Mode

我在代码中的几个不同位置使用db.Key.from_path(Model,Key_name),然后调用db.get()或Model.get by_Key_name()。我注意到后一个命令总是返回0个项目,即使我确信我应该返回一些东西。仔细检查后,我注意到db.Key.from_path()命令没有返回正确的键。返回的键看起来非常相似,特别是在开始时,但某些字符不同,它比数据存储查看器中显示的键短约75%。还有其他人遇到过这种情况吗?谢谢

以下是一些示例代码:

class Root(db.Model):
    pass

class Parent(db.Model):
    pass

class MyModel(db.Model):
    pass

root = Root().put()
parent = Parent(key_name=parentname,parent=root).put()
mymodel = MyModel(key_name=mymodelname,parent=parent).put()

mymodel_k = db.Key.from_path('Parent','parentname','MyModel','mymodelname')
mymodel = db.get(mymodel_k)

mymodel为None

您没有使用所有祖先正确构建路径

root = Root().put()  
parent = Parent(key_name=parentname, parent=root).put()  
mymodel = MyModel(key_name=mymodelname, parent=parent).put()
根->没有父级
父->具有父根
MyModel->具有父级

db.Key.from_path('Parent','parentname','MyModel','mymodelname')

这将丢失父密钥中包含的根祖先

正确的关键是:

db.Key.from_path('MyModel', 'mymodelname', parent=parent)

这就是为什么你创建的密钥更短!缺少一个祖先。

您没有使用所有祖先正确构建路径

root = Root().put()  
parent = Parent(key_name=parentname, parent=root).put()  
mymodel = MyModel(key_name=mymodelname, parent=parent).put()
根->没有父级
父->具有父根
MyModel->具有父级

db.Key.from_path('Parent','parentname','MyModel','mymodelname')

这将丢失父密钥中包含的根祖先

正确的关键是:

db.Key.from_path('MyModel', 'mymodelname', parent=parent)

这就是为什么你创建的密钥更短!缺少一个祖先。

看起来有两个祖先级别,因此您应该使用以下选项:

Key.from_path('Root', root.key().id(), 'Parent','parentname','MyModel','mymodelname')


看起来有两个祖先级别,因此您应该使用:

Key.from_path('Root', root.key().id(), 'Parent','parentname','MyModel','mymodelname')


Key.from_path“从一个或多个实体键的祖先路径构建一个新的键对象”,那么这就是您要做的吗?发布一些相关代码将大大有助于获得一个好的答案。@Sologoub:Key.from_path如果您提供相同的参数,将返回相同的键。谢谢您的评论,我已经包含了一些示例code.Key.from_path“从一个或多个实体键的祖先路径构建一个新的键对象”,那么这就是您正在尝试做的吗?发布一些相关代码将大大有助于获得一个好的答案。@Sologoub:Key.from_path如果您提供相同的参数,将返回相同的键。谢谢您的评论,我已包含一些示例代码。谢谢,@aschmid00。因此,如果我在自己的方法中调用它,我是否需要首先运行do query以获取parent,以便在db.Key.from_path()中使用它?在您的情况下,问题是您不知道并且无法构造根键,因为您让它由系统自动分配。这意味着,如果您真的需要根实体,您可以给它一个您定义的键,这样您就不需要查询了。如果您将其保留为“是”,则需要查询父实体。谢谢@aschmid00,这非常有用。欢迎您。在正确答案上打勾,使问题被设置为已解决谢谢,@aschmid00。因此,如果我在自己的方法中调用它,我是否需要首先运行do query以获取parent,以便在db.Key.from_path()中使用它?在您的情况下,问题是您不知道并且无法构造根键,因为您让它由系统自动分配。这意味着,如果您真的需要根实体,您可以给它一个您定义的键,这样您就不需要查询了。如果您将其保留为“是”,则需要查询父实体。谢谢@aschmid00,这非常有用。欢迎您。在正确答案上打勾,这样问题就可以解决了谢谢你,@Guido van Rossum!这不是来自ascmid00的相同答案吗?谢谢你,@Guido van Rossum!这不是来自ascmid00的相同答案吗?