繁体   English   中英

Django连续天数和最大连续天数查询

[英]Django Consecutive Days and Max Consecutive days Query

我有一个以下模型。

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,所以它被认为是最大条纹任何想法我怎么能实现这个查询?

我建议几点:

  1. 覆盖.save()方法或向CategoryModel添加post_save信号,以便您可以处理条纹逻辑。
  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 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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM