Как мне получить ключевое значение db.ReferenceProperty без обращения к базе данных?
-
02-07-2019 - |
Вопрос
Есть ли способ получить значение ключа (или идентификатора) db.ReferenceProperty без разыменования фактического объекта, на который он указывает?Я покопался - похоже, ключ хранится как имя свойства, которому предшествует _, но мне не удалось заставить какой-либо код работать.Я был бы весьма признателен за примеры.Спасибо.
Редактировать:Вот что я безуспешно пробовал:
class Comment(db.Model):
series = db.ReferenceProperty(reference_class=Series);
def series_id(self):
return self._series
И в моем шаблоне:
<a href="games/view-series.html?series={{comment.series_id}}#comm{{comment.key.id}}">more</a>
Результат:
<a href="games/view-series.html?series=#comm59">more</a>
Решение
На самом деле, способ, которым вы защищаете доступ к ключу для ReferenceProperty, вполне может не существовать в будущем.Атрибуты, начинающиеся с '_' в python, обычно считаются "защищенными" в том смысле, что их могут использовать вещи, которые тесно связаны с его реализацией, но вещи, которые обновляются вместе с реализацией, должны меняться при ее изменении.
Однако есть способ через открытый интерфейс получить доступ к ключу для вашего ссылочного свойства, чтобы оно было безопасным в будущем.Я пересмотрю приведенный выше пример:
class Comment(db.Model):
series = db.ReferenceProperty(reference_class=Series);
def series_id(self):
return Comment.series.get_value_for_datastore(self)
Когда вы обращаетесь к свойствам через класс, с которым они связаны, вы получаете сам объект property, у которого есть открытый метод, который может получать базовые значения.
Другие советы
Вы правы - ключ хранится как имя свойства с префиксом '_'.Вы просто должны иметь доступ к нему непосредственно из объекта модели.Можете ли вы продемонстрировать, что вы пытаетесь сделать?Я использовал эту технику в прошлом без каких-либо проблем.
Редактировать:Вы пробовали напрямую вызывать series_id() или напрямую ссылаться на _series в вашем шаблоне?Я не уверен, что Django автоматически вызывает методы без аргументов, если вы укажете их в этом контексте.Вы также могли бы попробовать поместить в метод декоратор @property.