Невозможно получить доступ к свойству ID от объекта хранилища данных

Используя Google App Engine SDK и Python, я сталкиваюсь с проблемой: я не могу получить доступ к свойству ID данного объекта свойства. Единственные свойства, к которым я могу получить доступ, являются определенными в моем классе Модель плюс ключевое свойство (см. ответ ниже):

class Question(db.Model):
    text = db.StringProperty()
    answers = db.StringListProperty()
    user = db.UserProperty()
    datetime = db.DateTimeProperty()

Я могу получить доступ к тексту, ответам, пользователю, дате и времени и ключевым свойствам очень хорошо. Однако я не могу получить доступ к свойству ID. Например, после выборки всех объектов (использующий Question.all ()):

# OK Within a template, this will return a string :
{{ question.text }}
# OK, this will return the entity key :
{{ question.key }}

# KO this will return nothing :
{{ question.id }}

Какие-либо идеи? Спасибо!

7
задан David Underhill 21 July 2010 в 20:48
поделиться

2 ответа

Согласно документации , не существует метода экземпляра id () , определенного для подклассов модели.

Попробуйте вместо этого {{question.key}} .

Также обратите внимание, что ключ не создается, пока объект не будет сохранен в хранилище данных.


Правка: дополнительная информация основана на редактировании OP:

Поскольку нам действительно нужен числовой идентификатор , мы могли бы сделать что-то вроде этого в нашем шаблоне:

{{question.key. id}}

Еще одно замечание: никогда не следует ожидать, что числовые идентификаторы увеличатся в значении в соответствии с порядком создания сущностей. На практике это обычно, но не всегда.

11
ответ дан 6 December 2019 в 12:50
поделиться

Я только что нашел возможное (неэлегантное, ИМО) решение. После запроса и выборки сущностей переберите их в цикле и вручную добавьте параметр id:

query = Question.all()
questions = query.fetch(10)

# Add ID property :
for question in questions:
    question.id = str(question.key().id())

Я не думаю, что это эффективно с точки зрения ЦП, но это работает как быстрое / грязное исправление.

5
ответ дан 6 December 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: