2016-09-07 1 views
0

Django와 rest-auth를 사용하고 있습니다.Django와 mysql이 어제의 로그인 수를 가져 오는 중

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_로 시작하는 사용자 이름으로 로그인 수를 얻으려면?

답변

2

last_login에 의존하는 것은 그것을자를 것이고 신뢰할 수없는 데이터를 제공 할 것입니다. 로그인 시간과 함께 사용자에게 외부 키잉 된 다른 테이블에 성공적인 각 로그인 이벤트를 저장해야합니다.

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

하루에 두 개 이상의 로그인을 저장하지 않아도됩니다. 사용자가 로그인 할 때 오늘 날짜가있는 항목이 있는지 확인하십시오. 존재한다면 아무것도하지 않아도됩니다. 존재하지 않으면 오늘 날짜가있는 새 행을 삽입해야합니다. 이 값을 적용하려면 ('user', 'login_data')에 대해 unique_together 제약 조건을 설정할 수도 있습니다.

이렇게하면 다음 쿼리를 통해 필요한 로그인 수 데이터를 얻을 수 있습니다.

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

이렇게하면 필요한 내부 조인이 만들어지고 카운트가 제공됩니다.

+0

오! 이것은 전혀 예상하지 못했습니다. 빠른 답장을 보내 주셔서 감사합니다! 한 가지 질문이 있습니다. 누군가 로그인 할 때이 테이블에 행을 삽입하는 방법은 무엇입니까? 지금 당장은 사용자 지정 사용자 모델이 없으며 travix rest-auth를 사용하여 인증하고 있습니다. 이 삽입 등으로이 LoginEvent 클래스에 대해 더 많은 코드를 제공 할 수 있습니까? – Nitish

+0

@Nitish travix-rest-auth에 익숙하지 않습니다. "travix-rest-auth를 사용하여 수동 게시 사용자 생성 논리를 추가하는 방법"에 대한 새로운 질문을 게시하는 것이 좋습니다. – arijeet

+0

예! 감사 :) – Nitish

관련 문제