首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Django获取发送者的列表以及他们发送的业力的相应总和?

如何使用Django获取发送者的列表以及他们发送的业力的相应总和?
EN

Stack Overflow用户
提问于 2012-04-19 08:45:44
回答 1查看 48关注 0票数 1

我正在构建一个应用程序来跟踪用户相互给予的业力。我希望能够在滚动的7天内建立一个排行榜,并列出在滚动的7天内给你最多因果报应的人的名单。我提出了以下模型:

代码语言:javascript
复制
class KarmaAction(models.Model):
    user = models.ForeignKey(User)
    sender = models.ForeignKey(User)
    karma = models.IntegerField()
    created_at = models.IntegerField()

首先,随着用户数量的增长,上述模型是否会得到很好的扩展?我正在考虑删除任何超过7天的行。其次,我想知道我如何创建一个发送者的列表,以及他们在过去几天中给予的业力的相应总和。也许它看起来像这样:

代码语言:javascript
复制
supporters = {'User 1': 14, 'User 2': 12, 'User 3': 7, 'User 4': 2}

有没有办法用Django ORM做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-19 12:42:38

这个模型对我来说似乎是合理的;我真的看不到另一种方法。无论如何,您需要其中的所有信息才能满足您的需求。(尽管created_at可能应该是一个DateTimeField?)如果它最终变得太慢,你可能不得不添加激进的缓存。

您可以这样做(未经测试,但我认为它应该可以工作)

代码语言:javascript
复制
TIME_RANGE = datetime.timedelta(days=7)
now = datetime.datetime.now()

KarmaAction.objects.filter(created_at__gte=now - TIME_RANGE) \
                   .filter(user=recepient_user) \
                   .values('sender') \
                   .annotate(total_sent=Sum('karma')) \
                   .order_by('total_sent')

这将use the values to group by unique senders and then sum their karma values

我添加了order_by,以确保如果有默认排序,it gets cleared and doesn't interfere with the grouping。它还使得获取报应的顶级n发送者变得很容易,只需在末尾添加例如[:5] --当然,如果您将其设置为-total_sent :)。

我不认为是filter导致了这个问题,但如果不进行测试,我就不敢肯定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10220144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档