Django Запрос последовательных дней и максимального количества последовательных дней
У меня есть следующая модель.
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()
или добавление сигналаpost_save
кCategoryModel
, чтобы вы могли обрабатывать логику потока. - Отслеживайте, когда создаются категории, это должно быть простое поле
created_on
DateTime. - Отслеживайте
current_streak
иmax_streak
на модели User .
Что касается реализации отслеживания полос, должно работать что-то вроде этого:
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()