1

我正在构建一个应用程序来跟踪用户相互给予的业力。我希望能够在 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 做到这一点?

4

1 回答 1

1

这个模型在我看来是合理的;我真的没有看到另一种方法来做到这一点。无论如何,您需要其中的所有信息才能满足您的要求。(虽然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')

它将使用values按唯一senders 分组,然后对它们的karma求和。

我添加了order_by以确保如果有默认排序,它会被清除并且不会干扰 grouping。不过,它还可以很容易地获得n业力的主要发送者,只需在末尾添加 eg [:5]——当然,如果你做到了-total_sent:)。

我不认为是filter导致这个问题的原因,但未经测试我不是肯定的。

于 2012-04-19T04:42:38.420 回答