我遇到了一个奇怪的问题,我在使用App Engine ORM进行get_by_key_name
调用之前没有看到过。
在任何情况下,人们都会认为,以下将返回无:
Model.get_by_key_name(Model.all().get().key().name())
然而,这就是我发现某些关键名称会发生的事情。仅在少数几种情况下,我使用以下开放ID URL作为key_name属性:
https://me.yahoo.com/a/jadjuh3s0klsghiLhtBNbIiHw8k-#3dcl3
(我改变了几个字符以保护无辜者)
也许是'#'符号?
解决方案:正如Nick Johnson建议的那样,我需要修改查询 实体有父母:
entity = Model.all().get() Model.get_by_key_name(entity.key().name(), parent=entity.parent_key())
无论情况如何,如果存在无法使用密钥名称来获取实体的情况,则不应该首先允许将其用作密钥名称。
答案 0 :(得分:4)
如果查询返回的实体是某个其他实体的子实体,则Model.get_by_key_name(Model.all()。get()。key()。name())将失败。没有父参数的get_by_key_name查找没有父项的实体,而查询可以返回子实体。
例如:
a = Model1()
a.put()
b = Model2(parent=a)
b.put()
Model2.get_by_key_name(Model2.all().get().key().name()) # Fails to return anything
Model2.get(Model2.all().get().key()) # Works as expected
答案 1 :(得分:0)
我尝试使用http://shell.appspot.com/中的示例键名重现它,但不能:
>>> class Foo(db.Expando):
pass
>>> Foo(key_name='https://me.yahoo.com/a/jadjuh3s0klsghiLhtBNbIiHw8k-#3dcl3').put()
datastore_types.Key.from_path(u'Foo', u'https://me.yahoo.com/a/jadjuh3s0klsghiLhtBNbIiHw8k-#3dcl3', _app_id_namespace=u'shell')
>>> Foo.get_by_key_name('https://me.yahoo.com/a/jadjuh3s0klsghiLhtBNbIiHw8k-#3dcl3')
<__main__.Foo object at 0x75f9c1aa9181d78>
(被授予,我没有使用你的模型类层次结构,你暗示它可能是触发它的原因。)