【问题标题】:Google app engine How to count SUM from datestore?谷歌应用引擎如何从数据存储中计算 SUM?
【发布时间】:2011-02-10 19:07:29
【问题描述】:

我想知道,如何获得从数据存储区 (python) 获得的评级实体的总和?

我应该:

ratingsum = 0
for rating in ratings:
    ratingsum + rating

print ratingsum

?

【问题讨论】:

    标签: python google-app-engine gql


    【解决方案1】:

    是的,差不多就是这样。检索您想要求和的所有实体,并在您的应用中对它们求和。 GQL 中没有SUM

    如果您想要完成的是找到一个实体的平均评分,那么有更好的方法。

    class RateableThing(db.Model):
        num_ratings = db.IntegerProperty()
        avg_rating = db.FloatProperty()
    

    查找事物的平均评分是一个简单的查找,添加一个新的评分只是:

    thing.avg_ratings = ((thing.avg_ratings * thing.num_ratings) + new_rating) / thing.num_ratings + 1
    thing.num_ratings += 1
    thing.put()
    

    App Engine 数据存储区的流行习惯是在写入时做尽可能多的工作,在读取时尽可能少做,因为读取会更频繁地发生。

    【讨论】:

    • 你的意思是在每次写入时计算评级并在每次写入时写入而不是在读取时计算?调用 thing.num_ratings 会得到实体的总和吗?还是我应该在每次写入时增加数字?因为我转移到数据存储区的待办事项重复并保存每个评分的密钥,所以我可以知道谁对什么评分等等。我不想要一个不断更新的总和实体。你是这个意思吗?
    • num_ratings 是事物被评分的次数。因此,每次添加评分时,增加num_ratings - 如果您想跟踪谁被评分,您可以保留ListProperty 的用户。如果您想跟踪谁的评分,以及他们评分的内容ListProperty of Rating(用户和分数)对象。但仍保留简单的评级(num_ 和 avg_)以避免计算每次读取的事物评级。只有当您想检查完整的评分数据时,您才应该进入用户评分列表。
    • 所以我应该始终保留一个评分汇总表,在其中我对每个用户评分进行评分以进行计算。非常感谢:)
    • 很遗憾,您不能拥有复合的、用户定义的数据类型的 ListProperties。
    【解决方案2】:

    我无法回答您问题的 Google App Engine 部分,但您的代码(如果您将 + 更改为 +=)相当于:

    ratingsum = sum(ratings)
    

    我很确定您可以在任何包含类似数字的对象的序列或可迭代对象上使用 sum()

    【讨论】:

    • 对你的回答,我不能。它是一个浮动。 4.5.我无法总结并加起来。它不可迭代:(
    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多