方便地迭代数据存储实体

时间:2012-02-16 14:51:00

标签: python google-app-engine

请教我如何以正确的方式做到这一点,因为我觉得我目前的方式是啰嗦。

我知道迭代App Engine中的所有实体并不是它的设计使用方式,但有时我想收集有关我的实体的统计信息,例如有多少用户是女性。实际上,标准可能更复杂,但无论如何都需要检查每个实体。

以下是关于我如何迭代实体的一些伪代码:

def handle_count_female_users(cursor = None, counter = 0):
    q = User.all()
    if cursor:
        q.with_cursor(cursor)
    MAX_FETCH = 100
    users = q.fetch(MAX_FETCH)

    count_of_female_users = len(filter(lambda user:user.gender == 'female', users))
    total_count = counter + count_of_female_users

    if len(users) == MAX_FETCH:
        Task(
            url = "/count_female_users",
            params = {
                'counter' : str(total_count),
                'cursor' : q.cursor()
            }
        ).add()
    else:
        # Now finally have the result
        logging.info("We have %s female users in total." % total_count)

我有自动映射GET / foo的路由代码,由handle_foo处理,这是我觉得方便的东西。正如你所看到的,即便如此,我有很多支持循环的东西,几乎与我真正想要完成的事情无关。

我真正想要的是:

tally_entities(
    entity_class = User,
    filter_criteria = lambda user:user.gender == 'female',
    result = lambda count:logging.info("We have %s female users in total" % count)
)

任何想法如何更接近这个理想,还是有更好的方法?

1 个答案:

答案 0 :(得分:3)

听起来像mapreduce的一个很好的用例: http://code.google.com/p/appengine-mapreduce/wiki/GettingStartedInPython