Django 计算特定用户在日期时间字段中某个日期的访问次数

Posted

技术标签:

【中文标题】Django 计算特定用户在日期时间字段中某个日期的访问次数【英文标题】:Django count visits on a date from datetime field for a particular user 【发布时间】:2017-10-14 03:24:23 【问题描述】:

我有一张桌子,看起来像:

  +-------+---------+---------------------+-------------+-----------+-----------------+
    | 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是外键,visit_time是访问页面的时间戳

这个想法是找到每个用户一天的访问次数。应该为每个用户每天返回一个单独的行。

所以它应该是这样的:

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

我正在尝试使用 Django ORM 构建查询。

这是模型定义:

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)   

我已经能够从visit_time 中提取日期:

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

如何使用 Django ORM 获取所需数据?

使用的数据库是 mysql

【问题讨论】:

您使用的是什么版本的 django?你看过这个链接吗? ***.com/questions/8746014/… 我使用的是 Django 1.11。除了TruncDate 部分(返回天为无)之外,那里的答案似乎有效。我改用RawSQL(DATE(visit_time)),它起作用了。谢谢。 【参考方案1】:

你需要使用

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')

【讨论】:

为了清楚起见:不应该用visits = Count('user_id')来统计访问次数吗? 我们正在计算行数,因此可以使用 id。另外,如果此答案解决了您的问题,请投票并标记为已接受:) 知道了。谢谢! 另外,queryset.values() 返回不能在 django 模型管理中使用的字典实例。知道如何在管理员中使用此查询集的结果吗?

以上是关于Django 计算特定用户在日期时间字段中某个日期的访问次数的主要内容,如果未能解决你的问题,请参考以下文章

Django 强制密码过期

django - 使用 lambda 进行 OR 查询

Django Admin显示/隐藏字段如果在下拉菜单中选择了特定值

如果在下拉列表中选择了特定值,则 Django 管理员显示/隐藏字段

如何计算特定日期的剩余月份? [复制]

验证模型表单日期字段时,Django 期望格式错误