2010-08-31 46 views
2

在GAE的基于python的facebook应用程序中,我想检查当前用户的哪些朋友已经“标记”了网页或不是。列表查询,列表中的Facebook朋友?

为此我必须运行尽可能多的数据库查询作为朋友的数量(比如说100) 我担心这可能会因为大量的查询而进入“超时”状态。

Google DOC建议“列表”查询并行运行,这会节省时间吗? 另外列表有30的限制,所以我必须做2或3个列表类型的查询。

请建议如果可能的话更好的方法,使用任务疑问句或东西....

+0

我不要求其正确和完整的遗憾,但我想查询结果按用户等级分类(1 - 5) – Tiwari 2010-08-31 19:59:10

回答

1

如果您已经知道他们的密钥或密钥名称,则可以并行获取多达1000个实体。

有几种方法可以解决您的具体问题。这是一个。

我们假设当用户“标记”一个网页时,您将创建一个带有从用户的facebook标识和页面关键字派生的key_name的实体。

class PageMarker(db.Model): 
    user = db.ReferenceProperty(AppUser) 
    .... 
    @classmethod 
    def mark_page(cls, user, page_key): 
     marker = cls.get_or_insert("%s_%s" % (user.facebook_id, 
              page_key, user=user) 

这可以让你获取所有谁标志着平行页面的用户:

key_names = ["%s_%s" % (friend.facebook_id, page_key) for friend in friends] 
markers = db.get(key_names) 
# Use get_value_for_datastore to get the entity key without making a trip to the 
# datastore 
friends_who_bookmarked_keys = [marker.__class__.user.get_value_for_datastore(marker)\ 
          for marker in markers] 
friends = db.get(friends_who_bookmarked_keys) 
+0

很多感谢你的回复,真的很有帮助,但我很抱歉没有要求它正确和完整,但我希望根据用户评分(1 - 5)排序查询结果,我应该在Python代码中排序结果还是尝试将它从查询中分类出来,成本更低 – Tiwari 2010-08-31 20:02:50

1

我建议如下:

  • 使“标记”谁标志着用户的实体子实体他们。
  • 对于基于网页的URL的“标记”实体标记
  • 要找到谁标志着一个页面的朋友使用的按键名称,检索的朋友列表,然后生成从实体键的列表朋友列表(因为您知道朋友关键字和URL,因此很容易),并且执行一次批量检索来检索指示哪些朋友已标记该页面的“标记”实体列表。