2

get_by_key_name在使用 App Engine ORM 拨打电话之前,我遇到了一个奇怪的问题。

在任何情况下,人们都不会假设以下返回 None:

Model.get_by_key_name(Model.all().get().key().name())

然而,这就是我发现某些键名会做的事情。仅在少数情况下,我使用如下的 Open ID URL 作为 key_name 属性:

https://me.yahoo.com/a/jadjuh3s0klsghiLhtBNbIiHw8k-#3dcl3

(我改变了几个字符来保护无辜者)

也许是“#”符号?

解决方案:正如尼克约翰逊所建议的,我需要修改查询,因为实体有父:

entity = Model.all().get()
Model.get_by_key_name(entity.key().name(), parent=entity.parent_key())

无论是哪种情况,如果存在无法使用键名来获取实体的情况,那么首先不应允许将其用作键名。

4

2 回答 2

4

如果查询返回的实体是某个其他实体的子实体,则 Model.get_by_key_name(Model.all().get().key().name()) 将失败。不带 parent 参数的 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
于 2009-10-08T08:46:10.790 回答
0

出于好奇,您是在生产中看到这个,还是在 sdk 中看到这个,或者两者兼而有之?

我试图用您在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>

(当然,我没有使用您的模型类层次结构,您暗示这可能是触发它的原因。)

于 2009-10-08T04:34:21.837 回答