Как мне получить ключевое значение db.ReferenceProperty без обращения к базе данных?

StackOverflow https://stackoverflow.com/questions/141973

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top