我如何得到一个发送者列表,以及他们使用Django发送的业力的相应总和?

2024-03-28 23:22:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

class KarmaAction(models.Model):
    user = models.ForeignKey(User)
    sender = models.ForeignKey(User)
    karma = models.IntegerField()
    created_at = models.IntegerField()

首先,上述模型是否会随着用户数量的增长而扩展?我正在考虑删除任何超过7天的行。第二,我想知道如何创建一个发送者列表,列出他们在过去几天中所付出的业力的总和。也许会像这样:

supporters = {'User 1': 14, 'User 2': 12, 'User 3': 7, 'User 4': 2}

有什么办法可以用Django ORM做到这一点吗


Tags: 用户模型应用程序modelmodelsclass排行榜foreignkey
1条回答
网友
1楼 · 发布于 2024-03-28 23:22:50

这个模型在我看来是合理的;我真的没有别的办法。无论如何,你需要所有的信息来满足你的要求(尽管created_at应该是DateTimeField?)如果它的速度太慢,您可能只需要添加主动缓存

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

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 ^{} to group by unique ^{}s and then sum their ^{} values

我添加了order_by,以确保如果存在默认顺序,it gets cleared and doesn't interfere with the grouping。不过,这也让你很容易找到业力的头号发送者,当然,只要在最后加上例如[:5],如果你做到了-total_sent,就可以了:)

我不认为是filter引起了这个问题,但我没有检测就不是阳性

相关问题 更多 >