Google app engine ndb: используя идентификатор или имя ключа?

Это о Google App Engine ndb. Согласно моим наблюдениям, если я создаю объект без предоставления какого-либо ключа, у объекта будет целое число, начинающееся с 1 и инкрементное, в поле ID, как показано в Datastore Viewer. Однако, если я создаю объект, предоставив строку как свой id, объект будет иметь строку в поле Key Name. Например:

Модель:

class Member(ndb.Model):
  ...

Программа:

member1 = Member()            # --> ID is 1, Key Name is None
member2 = Member(id='abc')    # --> ID is empty, Key Name is 'abc'

Кроме того, в html файле, если я использую

<input ... name="id" value={{member1.key.id}} ... />

в качестве параметра для возврата к серверной программе (Python), ни один из следующих двух операторов не будет работать для member1:

Member.get_by_id(self.request.get('id'))
member1 = Member.get_by_id(int(self.request.get('id')))

Однако, следующие html и программные коды:

<input ... name="id" value={{member2.key.id}} ... />
member2 = Member.get_by_id(self.request.get('id'))

будет работать для member2.

Кажется, нет проблем для объектов, созданных посредством предоставления идентификатора строки (то есть, member2). Но то же самое не работает для member1. Мои вопросы: а) Правильны ли мои наблюдения? б) Как получить член1 с помощью get_by_id()?

Ответ 1

a) В основном правильно, хотя вы можете получить member1 через второй метод, который вы показали. Также нельзя проверить, что идентификаторы целых чисел всегда начинаются с 1 и всегда будут инкрементными. Я видел смешанные результаты в отношении этого.

b) member1 = Member.get_by_id(int(self.request.get('id'))) должен работать

Вы также можете попробовать использовать key.urlsafe(), поэтому вам не нужно беспокоиться о конверсиях ключевых слов:

<input ... name="id" value={{member.key.urlsafe()}} ... />

member_key = self.request.get('id')
member = ndb.Key(urlsafe=member_key).get()