2012-02-16 46 views
1

請教我如何以正確的方式做到這一點,因爲我覺得我現在的做法很囉嗦。方便地對數據存儲實體進行迭代

我知道對App Engine中的所有實體進行迭代並不完全如何設計使用,但有時我想收集有關我的實體的統計信息,例如有多少用戶是女性。實際上,標準可能會更復雜一些,但無論如何都需要檢查每個實體。

這裏是我如何遍歷實體的一些pseudoish代碼:

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 /富由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) 
) 

任何想法如何來接近這個理想,或者是有一些更好的方法?

回答