Django和mysql获取昨天的登录数

时间:2016-09-07 17:48:21

标签: django django-rest-framework django-rest-auth

我正在使用Django和rest-auth。我已经有了一个工作代码,可以在我的Django应用程序中获取今天和昨天的登录计数,如下所示:

def get_analytics(request):

    total_users = User.objects.all().count()
    total_users_games = User.objects.filter(username__startswith='yg_').count()
    # Number of users who dogged in once to our system today
    today_login_count= User.objects.filter(last_login__startswith=timezone.now().date()).count()
    today_login_count_memoryGames= User.objects.filter(last_login__startswith=timezone.now().date(), username__startswith='yg_').count()
    yesterday_login_count = User.objects.filter(last_login__startswith=timezone.now().date() - timezone.timedelta(days=1)).count()
    yesterday_login_count_memoryGames = User.objects.filter(last_login__startswith=timezone.now().date() - timezone.timedelta(days=1), username__startswith='yg_').count()  

有些用户名以'yg'开头,很少以'yg_'开头,负责两个不同的前端。

今天的登录计数是正确的,我从数据库交叉检查。但是我不确定昨天的登录次数,看起来我得到的号码不正确(即今天的登录次数将是明天:昨天的登录次数,所以这些数字应该相同)。我怀疑昨天登录计数的代码给了我那些昨天登录而不是今天登录的用户,我想要的是昨天登录的所有用户。我在昨天的日期运行了以下查询并获得了4个结果,这实际上是什么

yesterday_login_count_memoryGames = User.objects.filter(last_login__startswith=timezone.now().date() - timezone.timedelta(days=1), username__startswith='yg_').count() 

给了我。

select username, last_login from auth_user where username like '%yg\_%' and last_login like '%2016-09-06%';

我正在使用以下sql查询在我的数据库中进行交叉检查:

select username, last_login from auth_user where username like '%yg\_%' and last_login like '%2016-09-07%';

如何编写查询以获取昨天的登录计数?

另外,在这一行username__startswith='yg_'中我是否需要转义字符?像username__startswith ='yg_'?获取以yg_开头的用户名登录的计数?

1 个答案:

答案 0 :(得分:2)

依靠last_login不会削减它并且会提供不可靠的数据。您需要将每个成功的登录事件存储在另一个外键控制的表中以及登录时间。

class LoginEvent(models.Model):
  user = models.ForeignKey(settings.AUTH_USER_MODEL)
  login_date = models.DateField()

请注意,您不需要在一天内存储多个登录信息。当用户登录时,检查是否存在具有今天日期的条目。如果它存在,那么不需要做任何事情。如果它不存在,则需要插入带有今天日期的新行。您甚至可以为unique_together设置('user', 'login_data')约束来强制执行此操作。

在此之后,以下查询将能够为您提供所需的登录计数数据。

yesterday = timezone.now().date() - timedelta(days=1)
LoginEvent.objects.filter(login_date=yesterday, user__username__startswith='yg_').count()

这将创建必要的内部联接并为您提供计数。