【问题标题】:Django Consecutive Days and Max Consecutive days QueryDjango连续天数和最大连续天数查询
【发布时间】:2022-07-19 17:02:39
【问题描述】:

我有以下型号。

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,如果用户连续添加 5 天,最大连胜也是 2,因为它是最大连胜,所以连胜是 5 天。

我只想显示为

{
"current_streak":3,
"max_streak":12
}

这里当前的连胜是 3,但之前的连胜是 12,所以它被认为是最大连胜 知道如何实现此查询吗?

【问题讨论】:

    标签: python sql django postgresql django-models


    【解决方案1】:

    我会建议一些事情:

    1. 覆盖.save() 方法或将post_save 信号添加到CategoryModel,以便您可以处理连续逻辑。
    2. 跟踪创建类别的时间,这应该是一个简单的created_on DateTime 字段。
    3. 在 User 模型上跟踪 current_streakmax_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 category 
          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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多