【问题标题】:get the key string of a reference property without using the datastore in App Engine在 App Engine 中不使用数据存储区的情况下获取引用属性的键字符串
【发布时间】:2012-12-30 03:19:00
【问题描述】:

如何在不使用数据存储区获取对象的情况下获取引用属性的键字符串?

我有 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.add(str(video.key()), video)
 memcache.add(str(track.key()), track)

现在我可以从内存缓存中获取视频或曲目:

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

但是,这会为曲目生成一个数据存储请求,即使我不希望它这样做。具体来说,video.track请求会自动调用datastore获取Track对象,然后调用key()确定key字符串。

我想从链接的 ReferenceProperty 中获取键值,而无需实际实例化 Track 对象。你知道我该怎么做吗?

【问题讨论】:

  • 您可以使用KeyProperty 代替ReferenceProperty。这样你就只能得到实体的密钥。如果需要加载实体,直接通过key获取。

标签: python google-app-engine datastore referenceproperty


【解决方案1】:

正如有人提到的,您可以将属性更改为 KeyProperty,或者您可以使用属性的 property.get_value_for_datastore(obj) 方法来获取密钥而不解析对象。

请参阅文档https://developers.google.com/appengine/docs/python/datastore/propertyclass#Property_get_value_for_datastore

通常您会使用它来获取密钥,例如

key = myclass.some_property.get_value_for_datastore(some_obj)

所以在你的例子中

track_key = Video.track.get_value_for_datastore(视频)

干杯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2011-02-10
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多