При некоторых обстоятельствах вызов App Engine «get_by_key_name» с использованием существующего key_name возвращает None - PullRequest
2 голосов
/ 08 октября 2009

Я столкнулся со странной проблемой, с которой я не сталкивался до совершения вызова get_by_key_name с использованием App Engine ORM.

Ни при каких обстоятельствах нельзя было бы предположить, что следующее не вернет None:

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

И все же, я обнаружил, что подойдут некоторые ключевые имена. Лишь в нескольких случаях я использую URL-адреса Open ID, подобные следующим, как атрибуты 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())

Как бы то ни было, если есть обстоятельства, когда имя ключа не может быть использовано для извлечения сущности, его нельзя использовать в качестве имени ключа.

Ответы [ 2 ]

4 голосов
/ 08 октября 2009

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
0 голосов
/ 08 октября 2009

из любопытства, вы видите это в производстве, или в 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>

(само собой разумеется, я не использую вашу иерархию классов моделей, которая, как вы предполагали, может быть причиной ее возникновения.)

...