почему модель имеет имя-ключа не имеет ключа (). id () в Google-App-Engine - PullRequest
3 голосов
/ 18 июля 2010

если я использую это:

class A(db.Model):
    a=db.StringProperty()

class demo(BaseRequestHandler):
    def get(self):
        a=A()
        a.a='sss'
        a.put()
        raise Exception(a.key().id())

я могу получить a.key (). Id () равен 961

, но если я добавлю имя_ключа = "aaa", то.key (). id () будет None:

class A(db.Model):
    a=db.StringProperty()

class demo(BaseRequestHandler):
    def get(self):
        a=A(key_name="aaa")
        a.a='sss'
        a.put()
        raise Exception(a.key().id())

, так как я могу получить ключ (). id (), когда я задаю имя_ключа

спасибо

1 Ответ

6 голосов
/ 18 июля 2010

Вы не можете, потому что это одно и то же.

Тот факт, что у сущностей есть закодированный строковый ключ плюс либо целочисленный идентификатор, либо строковое имя, может создать обманчивое впечатление, что различные способыссылаются на сущность, являются дублирующими или избыточными.Это не так.

Имя ключа похоже на имя файла в файловой системе.Идентификатор похож на имя файла, которое система выбрала автоматически.Сам ключ похож на полный путь к файлу, включая каталоги.

Рассмотрим метод Key.from_path:

k = Key.from_path('User', 'Boris', 'Address', 9876)

kind=User&name=Boris похож на каталоги kind=Address&name=9876 похож на файл, содержащий вашу сущность.Возвращенный ключ - это просто закодированная версия этого пути.

App Engine полагается на то, что у каждого объекта есть один фиксированный, неизменный путь, то есть один ключ.Если объект может быть представлен как назначенным пользователем именем , так и идентификатором, назначенным системой, это будет означать, что один объект с n предками может иметь 2 ^ (n + 1) разные пути и ключи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...