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()