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, поэтому он рассматривается как максимальная полоса Есть идеи, как я могу выполнить этот запрос?

Я бы предложил несколько вещей:

  1. Переопределение метода .save() или добавление сигнала post_save к CategoryModel, чтобы вы могли обрабатывать логику потока.
  2. Отслеживайте, когда создаются категории, это должно быть простое поле created_on DateTime.
  3. Отслеживайте current_streak и max_streak на модели User
  4. .

Что касается реализации отслеживания полос, должно работать что-то вроде этого:

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()

Вернуться на верх