Пожалуйста, расскажите мне, как сделать это правильно, так как я чувствую, что мой нынешний путь многословен.
Я знаю, что перебирать все сущности в 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)
Iесть код маршрутизации, который автоматически отображает 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)
)
Есть идеи, как приблизиться к этому идеалу, или есть какой-то еще лучший способ?