Как получить ключ для текущей записи в GAE ndb в цикле Python for?

В настоящее время у меня есть веб-страница, на которой представлен список записей из хранилища данных со ссылкой для редактирования. Я хочу преобразовать это из db. к ндб. Я новичок в Python и GAE.

Текущий код =

  <tbody>
    {% for listtype in listtypes %}
    <tr>
      <td> {{ listtype.ListTypeName }} </td>
      <td><a href ="/listtypes/edit/{{ listtype.key().id() }}">edit </a></td>
    </tr>
    {% endfor %}    
  </tbody>

Затем на стороне .py у меня есть:

def post(self, listtype_id):
    iden = int(listtype_id)
    listtypes = db.get(db.Key.from_path('ListTypes', iden))
    listtypes.ListTypeName = self.request.get('ListTypeName')
    listtypes.put()

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

Укажите, как должен выглядеть фактический код, чтобы это работало с ndb.

Заранее спасибо.


person Bill G.    schedule 09.08.2012    source источник


Ответы (1)


Ключ NDB является атрибутом, а не методом. Итак, вы listtype.key().id() должны быть listtype.key.id()

person Tim Hoffman    schedule 09.08.2012
comment
Спасибо за быстрый ответ. Это позволяет шаблону html отображать правильную ссылку. Однако в def get(self, lang_id): iden = int(lang_id) listtypes = ndb.get(ndb.Key.from_path('ListTypes', iden)) я получаю сообщение об ошибке get listtypes = ndb.get(ndb .Key.from_path('ListTypes', iden)) AttributeError: объект 'module' не имеет атрибута 'get' Как должен выглядеть код на стороне получения в функции редактирования? Спасибо. - person Bill G.; 09.08.2012
comment
Извините, заявление, которое я представил в .py, не является примером хранилища данных, которое работает правильно. Thet code = listtypes = db.get(db.Key.from_path('ListTypes', iden)) Суть в том, что я ищу эквивалент этого для NDB. Спасибо. - person Bill G.; 09.08.2012
comment
Привет, наверное, пора начать читать документы. developers.google.com/appengine/docs/python/ndb/ и developers.google.com/appengine/docs/python/ndb / - person Tim Hoffman; 09.08.2012
comment
Я неоднократно просматривал эту документацию в течение нескольких дней, но не смог интерполировать то, что мне нужно из документации. В документации приведен пример извлечения сущности: sandy = sandy_key.get(). У них также есть пример получения идентификатора для entity = ident = rev_key.id(). В моем случае мне нужно иметь возможность получить сущность из идентификатора. Я не знаю ключ. Что такое оператор NDB для извлечения объекта из идентификатора, если у вас нет ключа? Спасибо. - person Bill G.; 09.08.2012
comment
Если вы пытаетесь получить объект с идентификатором и типом, вы можете создать ключ. В приведенном выше примере вы пытаетесь использовать key_from_path, которого нет в ndb. Взгляните на ключевые аргументы конструктора. class Key(flat=[kind1, id1, kind2, id2, ...]) Почти то же самое. см. ссылку ndb. После того, как вы создали ключ, вы можете вызвать get() - person Tim Hoffman; 09.08.2012
comment
Я нашел следующее, которое работает. listtype = ndb.Key('ListTypes', ident).get() Есть ли причина, по которой мне не следует его использовать? Спасибо. - person Bill G.; 09.08.2012
comment
Ага, именно об этом я и говорил. Путь в ключе — это вид, идентификатор. Последовательность из них включает родителя (ей). Как я уже сказал, вы должны прочитать о ключах в ndb и appengine в целом. - person Tim Hoffman; 09.08.2012