получить ключевую строку ссылочного свойства без использования хранилища данных в App Engine

Как получить ключевую строку ссылочного свойства без использования хранилища данных для получения объекта?

У меня есть 2 объекта хранилища данных, связанные db.ReferenceProperty:

 class Track(db.Model):
   name   = db.StringProperty()
 class Video(db.Model):
   name  = db.StringProperty()
   track = db.ReferenceProperty(Track, collection_name='video-track')

Это упрощает получение связанной дорожки из данного видео:

 video = Video.get(a_video_key_string)
 track = video.track

И я могу сохранить их в memcache для быстрого доступа позже:

 memcache.add(str(video.key()), video)
 memcache.add(str(track.key()), track)

Теперь я могу получить видео или трек из memcache:

 video = memcache.get(a_video_key_string)
 track = memcache.get(str(video.track.key()))

Однако это генерирует запрос хранилища данных для дорожки, хотя я этого не хочу. В частности, запрос video.track автоматически вызывает хранилище данных для получения объекта Track, а затем вызывает функцию key() для определения строки ключа.

Я хочу получить значение ключа из связанного ReferenceProperty без фактического создания экземпляра объекта Track. Вы знаете, как я могу это сделать?


person peawormsworth    schedule 30.12.2012    source источник
comment
Вы можете использовать KeyProperty вместо ReferenceProperty. Таким образом, вы получаете только ключ сущности. Если вам нужно загрузить сущность, вы получаете ее напрямую по ключу.   -  person Thanos Makris    schedule 30.12.2012


Ответы (1)


Как кто-то упомянул, вы можете изменить свойство на KeyProperty, в качестве альтернативы вы можете использовать метод свойства property.get_value_for_datastore(obj) для получения ключа без разрешения объекта.

См. документы https://developers.google.com/appengine/docs/python/datastore/propertyclass#Property_get_value_for_datastore

Обычно вы использовали бы его, чтобы получить ключ, используя что-то вроде

ключ = мой класс.some_property.get_value_for_datastore(some_obj)

Так что в вашем случае из ваших примеров

track_key = Video.track.get_value_for_datastore(видео)

Ваше здоровье

person Tim Hoffman    schedule 30.12.2012