请教我如何以正确的方式做到这一点,因为我觉得我目前的方式是啰嗦。
我知道迭代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)
)
任何想法如何更接近这个理想,还是有更好的方法?
答案 0 :(得分:3)
听起来像mapreduce的一个很好的用例: http://code.google.com/p/appengine-mapreduce/wiki/GettingStartedInPython