2017-05-15 1 views
2

J'ai une table qui ressemble à:visites compte Django à une date de champ datetime pour un utilisateur particulier

+-------+---------+---------------------+-------------+-----------+-----------------+ 
    | id | user_id | visit_time   | action  | user_type | erp_customer_id | 
    +-------+---------+---------------------+-------------+-----------+-----------------+ 
    | 17460 |  818 | 2017-05-15 15:02:13 | NULL  | customer |    932 | 
    | 17459 |  818 | 2017-05-15 15:02:11 | NULL  | customer |    932 | 
    | 17458 |  818 | 2017-05-15 15:01:56 | NULL  | customer |    932 | 
    | 17457 |  818 | 2017-05-15 15:01:55 | NULL  | customer |    932 | 
    | 17456 |  818 | 2017-05-15 15:01:47 | NULL  | customer |    932 | 
    | 17455 |  818 | 2017-05-15 15:01:15 | NULL  | customer |    932 | 
    | 17454 |  818 | 2017-05-15 15:00:44 | NULL  | customer |    932 | 
    | 17453 |  818 | 2017-05-15 14:59:58 | NULL  | customer |    932 | 
    | 17452 |  818 | 2017-05-15 14:59:55 | NULL  | customer |    932 | 
    | 17451 |  818 | 2017-05-15 14:59:55 | NULL  | customer |    932 | 
    | 17450 |  818 | 2017-05-15 14:59:52 | NULL  | customer |    932 | 
    | 17449 |  817 | 2017-05-15 14:55:46 | NULL  | customer |    931 | 
    | 17448 |  817 | 2017-05-15 14:55:45 | NULL  | customer |    931 | 
    | 17447 |  817 | 2017-05-15 14:53:55 | NULL  | customer |    931 | 
    | 17446 |  817 | 2017-05-15 14:53:54 | NULL  | customer |    931 | 
    | 17445 |  817 | 2017-05-15 14:53:26 | NULL  | customer |    931 | 

user_id est une clé étrangère, visit_time est l'horodatage de la visite d'une page.

L'idée est de trouver le nombre de visites de chaque utilisateur pour une journée. Une ligne séparée doit être retournée pour chaque jour pour chaque utilisateur.

Il devrait ressembler à:

{'user' : 818 , 'day' : 2017-05-15 , 'visits' : 12} 
{'user' : 817 , 'day' : 2017-05-15 , 'visits' : 5 } 

Je suis en train de construire la requête en utilisant Django ORM.

Voici la définition du modèle:

class Log(models.Model): 
    class Meta: 
     db_table = "users_log" 
     managed = False 
    user = models.ForeignKey(LoginCustomer , db_column = "user_id") 
    customer = models.ForeignKey(Customer , db_column = "erp_customer_id") 
    visit_time = models.DateTimeField() 
    user_type = models.CharField(max_length = 25) 

Je suis en mesure d'extraire la date de visit_time en utilisant:

Log.objects.annotate(day = RawSQL('DATE(visit_time)',[])) 

Comment puis-je obtenir les données souhaitées à l'aide de Django ORM?

La base de données utilisée est MySQL.

+1

Quelle version de django utilisez-vous? Avez-vous vu ce lien? http://stackoverflow.com/questions/8746014/django-group-by-date-day-month-year – Colwin

+0

J'utilise Django 1.11. La réponse là-dedans semble fonctionner sauf la partie 'TruncDate' (renvoie le jour comme None). J'ai utilisé 'RawSQL (DATE (visit_time))' à la place et cela a fonctionné. Merci. –

Répondre

1

Vous devez utiliser

from django.db.models import Count 
from django.db.models.functions import TruncDay 
Log.objects 
.annotate(period=TruncDay('visit_time')) 
.values('period', 'user_id') 
.annotate(visits=Count('id')) 
.values('period', 'visits') 
+0

Cela fonctionne! Merci! –

+0

Juste pour plus de clarté: Est-ce que 'visites = Count ('user_id') ne devrait pas être utilisé pour compter le nombre de visites? –

+0

Nous comptons le nombre de lignes, donc c'est bon d'utiliser les identifiants. Aussi, si cette réponse résout votre requête s'il vous plaît upvote et marquez-le accepté :) –