2016-06-21 4 views
0

J'ai une application Django où j'ai une vue qui renvoie le nombre d'utilisateurs qui se sont connectés aujourd'hui. déclaration correspondante est la suivante:Django afficher le nombre d'utilisateurs de retour basé sur last_login

login_count= User.objects.filter(last_login__startswith=timezone.now().date()).count() 

Je veux obtenir le nombre d'utilisateurs qui ne se connectent une fois la semaine dernière et tout le mois. Comme, ici timezone.now() renvoie la date d'aujourd'hui, y a-t-il quelque chose comme la gamme qui couvrira une semaine ou un mois?

+0

https://docs.python.org/2/library/datetime.html#timedelta-objects –

Répondre

2

Oui, il y a, et its even named range.

Exemple

import datetime 
start_date = datetime.date(2005, 1, 1) 
end_date = datetime.date(2005, 3, 31) 
User.objects.filter(last_login__range=(start_date, end_date)) 

de la dernière semaine

Cependant,

Filtrage d'une DateTimeField avec des dates ne seront pas inclure des articles sur le dernier jour, parce que les limites sont interprétés comme "0am à la date donnée". Si pub_date était un DateTimeField, l'expression ci-dessus serait transformé en ce SQL:

Une solution rapide serait d'ajouter simplement un jour, donc la gamme date va jusqu'à la dernière minute d'aujourd'hui, mais pas plus (également mettre à jour last_week).

today = datetime.date.today() + datetime.timedelta(days=1) 
last_week = datetime.date.today() - datetime.timedelta(days=7) 
User.objects.filter(last_login__range=(last_week, today)) 
+0

Vraiment bon! Mais maintenant, start_date et end_date sont codés en dur. C'est quelque chose qui sera appelé tous les jours, donc start_date pourrait être datetime.date (timezone.now(). Date()). Comment puis-je l'étendre pour end_date? – Nitish

+0

Est-ce que timezone.now(). Date() - timedelta (days = 7) la direction correcte? – Nitish

+0

Oui, c'est correct. Je l'avais juste ajouté à la réponse. – C14L