在某些情况下,使用现有key_name的App Engine“get_by_key_name”调用将返回None

时间:2009-10-08 01:22:00

标签: google-app-engine google-cloud-datastore data-modeling

我遇到了一个奇怪的问题,我在使用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())

无论情况如何,如果存在无法使用密钥名称来获取实体的情况,则不应该首先允许将其用作密钥名称。

2 个答案:

答案 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)

出于好奇,你是在生产中,还是在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>

(被授予,我没有使用你的模型类层次结构,你暗示它可能是触发它的原因。)