【问题标题】:How do I implement snap chat streak like feature?如何实现快速聊天连胜功能?
【发布时间】:2022-08-19 04:29:36
【问题描述】:

我没有建立关于类似于 Snapchat 的连拍功能的逻辑。以下是在snapchat 中计算连胜的方式 问题是。 如果用户每 24 小时添加一次新数据记录,则无论他/她添加多少条记录,连续为 1,如果他/她在下一个时间段内未能添加并在接下来的 24 小时时间范围内添加 +1,则连续为 0从添加的最后一条记录开始。

如果用户添加答案而不是保持连胜,则连胜实际上是基于用户和答案的。

我在 django 中尝试了这段代码,但任何语言的任何帮助都是有价值的

class ModelAnswer(BaseModel):
    questions = models.ForeignKey(
        to=Questions,
        on_delete=models.CASCADE
    )
    answer = models.TextField()
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    current_streak = models.PositiveIntegerField(
        null=True,
        blank=True,
        default=0,
        editable=False

    )

这是我的主要逻辑部分,这不能按要求工作

def save(self, *args, **kwargs):

    today = timezone.now()
    yesterday = today - timedelta(days=1)
    print(today,yesterday)

    # get the categories created yesterday to maintain the streak
    answers_created_yesterday = ModelAnswer.objects.filter(
        Q(created_at__gte=yesterday),
        Q(created_at__lt=today),
        user=self.user
    ).order_by(\'-id\').last()

    if answers_created_yesterday is not None:
        self.current_streak = answers_created_yesterday.current_streak + 1
    else:
        self.current_streak = 1
    print(self.current_streak)
    super(ModelAnswer, self).save(args, kwargs)
  • 更详细地解释你的问题。是为用户添加条纹还是为答案添加?用户是否必须与答案交互才能获得连胜?简而言之,解释在你的情况下条纹应该如何工作。
  • 如果用户添加答案@Art,则实际上会添加条纹
  • 那么,current_streak 字段在用户模型上更好,而不是在答案上。
  • 哦,我的错 :( 无论如何我可以实现
  • 如果用户在接下来的 24 小时内未添加答案,则连续性是否会回落到 0,或者连续性是否保持不变?

标签: python django django-models


【解决方案1】:

就因为你说任何语言的帮助都是有价值的,我会用英语回答。

  1. 您的答案应该有一个 DateTime 字段
  2. streak 可以是一个字典 {"start":last_week, "current":whenever_check_function_runs"}
  3. 只需访问最后一个答案 (order_by("-AnswerDate").last()) 并使用 timezone.now() 计算 delta 并显示 streak_count,如果 delta 小于 24 小时并设置 streak["current"]到 timezone.now()。
  4. 您不需要所有答案,您需要用户的最后一个答案。
  5. 如果 delta 超过 24 小时,将 streak["start"], streak["current"] 设置为 timezone.now()
  6. 通过计算 (streak["start"], streak["current"]) +1 的 delta 返回 streak_count

    我希望它有所帮助。

【讨论】:

    【解决方案2】:

    我创建了一个具有类似连胜系统的日记应用程序。

    我使用的方法是将last_answered 字段添加到用户/配置文件模型中。每次用户上传日志时,last_answered 都会设置为当前时间。然后,为了确保在他们提交下一个帖子之前连续记录不会停留在(例如)2,每次用户查看他们的连续记录时都会运行一次检查以查看last_answered 是否超过 24 小时。

    此外,正如@Art 在 cmets 中指出的那样,current_streak 应该保存在用户/配置文件模型中。

    要将这两个字段添加到用户模型中,您应该使用配置文件模型扩展用户模型,如下所示:

    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        last_answered = models.DateTimeField(null=True)
        streak = models.IntegerField(default=0)
    

    然后每次用户查看连胜记录——或者如果你想节省资源,你可以使用@Art提到的方法并使用celery运行函数——你应该运行这个检查

    from datetime import datetime, timedelta
    
    def update_streak(self):
        current = datetime.now()
        delta = current - self.last_answered
    
        if delta > timedelta(1)
            self.streak = 0
        return True
    

    当然,您也可以使用您的方法,搜索最新答案并测试它的提交时间,但是您应该将确切的提交时间保存到ModalAnswer

    最后,提交时,您应该增加连胜。此功能确保这是一个新的一天,以确保用户不能通过提交一堆条目来滥用连胜。如果你想更接近地模拟 snapchat,可以将上面函数中的连续丢失阈值调整为 36 小时左右,给用户一点回旋余地。

    def save(self, *args, **kwargs):
        today = datetime.now().date()
        last_submitted = self.request.user.profile.last_answered
        delta = today - last_submitted.date()
    
        if delta > timedelta(1):
            self.request.user.profile.increment_streak()    
    

    然后在Profile 模态中:

    def increment_streak():
        self.streak += 1
    

    我只是出于习惯将increment_streak 放在单独的函数中,但您也可以将它放在保存函数中。请记住,如果您没有配置文件模型或类似的东西并计划实施它,您将需要更改您的用户注册模型和表单。

    一个显着的缺点是,如果用户决定在晚上 11:59 熬夜,从技术上讲,他们可以在几分钟内将他们的连胜纪录增加 2 次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多