我正在构建一个应用程序来跟踪用户相互给予的业力。我希望能够在滚动的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做到这一点?
发布于 2012-04-19 12:42:38
这个模型对我来说似乎是合理的;我真的看不到另一种方法。无论如何,您需要其中的所有信息才能满足您的需求。(尽管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 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导致了这个问题,但如果不进行测试,我就不敢肯定。
https://stackoverflow.com/questions/10220144
复制相似问题