我有一个以下模型。
class CategoryModel(BaseModel):
name = models.CharField(max_length=100)
icon = models.ImageField(upload_to=upload_icon_image_to)
description = models.CharField(max_length=100)
user = models.ForeignKey(User,on_delete=models.CasCade)
def __str__(self):
return self.name
基本思想是,每当用户在一天内添加一个类别时,无论是1个还是20个记录,它都被视为1连胜,如果用户再次添加一个新类别,那么它被视为+1连胜,因此当前连胜将是2,最大连胜也是2,如果用户连续添加5天连胜是5天,因为它是最大连胜。
我只想显示为
{
"current_streak":3,
"max_streak":12
}
这里的当前连胜是3,但之前的连胜集是12,所以它被视为最大连胜任何想法,我如何才能实现这个查询?
我有几点建议:
- 覆盖
.save()
方法或在CategoryModel
中添加post_save
信号,以便处理条纹逻辑。 - 跟踪类别创建时,这应该是一个简单的
created_on
DateTime字段。 - 跟踪用户模型上的
current_streak
和max_streak
至于跟踪条纹的实现,应该这样做:
from datetime import datetime, timedelta
class User
...
def update_streak(self):
"""
When a category is created, check whether a category was created
yesterday or not. If it was then add +1 to the streak, otherwise set
the streak to 1. Then check if the max streak has been bested.
"""
today = datetime.now().date()
yesterday = today - timedelta(days=1)
# get the categories created yesterday to maintain the streak
categories_created_yesterday = self.categorymodel_set.filter(
created_on__gte=yesterday,
created_on__lt=today
)
if categories_created_yesterday.exists():
self.current_streak += 1
else:
self.current_streak = 1
if self.current_streak > self.max_streak:
self.max_streak = self.current_streak
self.save()
创建类别后,可以调用category.user.update_streak()