我的网站上有点奖励方法,我想创建“过去10天内的顶级用户”列表。现在我在Profile模型中存储和更新用户分数,这是:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
points = models.IntegerField(default=0)
但我希望在10天前获得此“点”实例的值,以便将其与最新值进行比较。我怎么能实现这个目标呢?
答案 0 :(得分:1)
通常,无法检查数据库字段的先前值。 AWS RDS具有与此类似的一些功能,但它们用于灾难恢复/取证目的,对于频繁使用而言并不实用。
这意味着您必须自己在某处存储历史数据。
一种简单的方法是选择截止时间,例如每天,并记录当时的每个分数。根据您的需要,有许多合理的设计 - 一个非常简单的设计是在Profile中添加一个字段,用于存储过去10天截止时间内用户分数的JSON列表。然后安排在截止时间运行的作业,将当前分数添加到列表中,并删除最旧的分数。
更强大,更昂贵的解决方案是跟踪每个点的变化。使用模式(ProfileId,PointChange,Date)创建一个新表,并在每次获得或失去一个点时添加一行。存储完整个历史记录后,您可以构建一个可以回答有关先前状态的任何可能问题的查询。您可能希望运行一个清理作业来删除Date已经足够旧的数据,因为这个表可能会很快增长。
答案 1 :(得分:1)
您可以使用django-simple-history之类的内容。此应用程序自动存储您在单独的表中指定的表的历史数据。
您可以在模型中添加HistoricalRecords
字段:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
points = models.IntegerField(default=0)
history = HistoricalRecords()
然后,您可以查询特定时间戳的历史记录,如下所示:
from datetime import datetime
hist_profile = profile.history.as_of(datetime(2018, 01, 01, 12, 0, 0))