首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Google App Engine for Python中的引用列表

Google App Engine for Python中的引用列表
EN

Stack Overflow用户
提问于 2011-01-18 09:29:49
回答 2查看 2.7K关注 0票数 18

在Google App Engine中,有一种叫做ListProperty的东西,它允许您保存项目的列表(数组)。您还可以指定所持有的项的类型,例如字符串、整数或其他任何类型。

Google App Engine还允许你拥有一个ReferenceProperty。ReferenceProperty“包含”对另一个Google App Engine Model实体的引用。如果您访问ReferenceProperty,它将自动检索引用所指向的实际实体。这很方便,因为它胜过获取密钥,然后获取所述密钥的实体。

但是,我没有看到任何类似ListReferenceProperty (或ReferenceListProperty)的东西。我希望保存对其他实体的引用列表,当我尝试访问列表中的元素时,该列表将自动解析。我能得到的最接近的结果似乎是保存一个db.Key对象列表。然后,我可以使用这些键从服务器中手动检索它们关联的实体。

有什么好的解决方案吗?基本上,我希望能够拥有对其他实体的(自动取消引用)引用的集合。我几乎可以通过拥有其他实体的关键字集合来实现这一点,但我希望它“知道”这些是关键项,并且可以将它们作为对我的服务取消引用。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-19 07:57:43

第一步:

使用db.ListProperty(db.Key)创建关系。您希望ListProp位于多对多关系中引用较少的实体上。这也会给你一个反向引用。所以:

代码语言:javascript
复制
class Spam
  prop1 = db.String
  eggs = db.List

class Eggs
  prop1 = db.string
  @property
  def spams(self):
    return Spam.all().filter('eggs', self.key())

这提供了一个双向的参考。

第二步:

创建一个解除属性引用的实用方法。

代码语言:javascript
复制
def prefetch_refprops(entities, *props):
    """Dereference Reference Properties to reduce Gets.  See:
    http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine
    """
    fields = [(entity, prop) for entity in entities for prop in props]
    ref_keys = [prop.get_value_for_datastore(x) for x, prop in fields]
    ref_entities = dict((x.key(), x) for x in db.get(set(ref_keys)))
    for (entity, prop), ref_key in zip(fields, ref_keys):
        prop.__set__(entity, ref_entities[ref_key])
    return entities  

用法为:

代码语言:javascript
复制
derefrenced_spams = prefetch_refprops(Spams, models.Spam.eggs)    
票数 13
EN

Stack Overflow用户

发布于 2011-01-18 09:56:04

你说得对,没有内置的ReferenceListProperty。你可以自己写一个--自定义属性子类通常是相当容易的--但是当涉及到延迟和缓存引用列表时,正确地实现它比你想象的要难。

但是,您可以使用db.ListProperty(db.Key),它允许您存储密钥列表。然后,您可以使用批处理db.get()操作单独或一次性加载它们。这需要您自己完成解析步骤,但它也让您可以更好地控制何时取消引用实体。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4719700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档