【问题标题】:Django uniqe by date queryset filteringDjango uniqe 按日期查询集过滤
【发布时间】:2016-11-04 13:51:14
【问题描述】:

我有一个代表访问的查询集,现在我需要按天过滤整个星期的唯一访问。

class Visit(models.Model):
    user = models.ForeignKey(User)
    created_at = models.DateTimeField(auto_now_add=True)


week = timezone.now().date() - timedelta(days=7)
visits = Visit.objects.filter(created_at__gte=week)

如何过滤访问查询集以获取一周范围内每天的唯一访问次数。因此,如果用户在一天内来了 4 次,则这是一次独特的访问。预期结果是整数,表示上周的唯一访问次数。

【问题讨论】:

    标签: python django django-views django-queryset


    【解决方案1】:

    下面将在查询集中创建一个名为 visit_date 的新字段:这是模型的 created_at 属性中的日期(已去除时间)。使用Count函数,我们可以按用户和日期对查询集进行分组,并统计每个日期的访问次数:

    from django.db.models import Count
    
    week = timezone.now().date() - timedelta(days=7)
    visits = Visit.objects.filter(created_at__gte=week)).extra({'visit_date' : 'date(created_at)'}).values('user', 'visit_date').annotate(visits_on_date=Count('pk'))
    

    visits 查询集看起来类似于:

    [
        {'user': 1, 'visit_date': datetime.date(2016, 11, 4), 'visits_on_date': 2},
        {'user': 2, 'visit_date': datetime.date(2016, 11, 4), 'visits_on_date': 5},
        {'user': 1, 'visit_date': datetime.date(2016, 11, 3), 'visits_on_date': 7},
        {'user': 2, 'visit_date': datetime.date(2016, 11, 3), 'visits_on_date': 9},
        {'user': 1, 'visit_date': datetime.date(2016, 11, 2), 'visits_on_date': 5}
    ]
    

    查询集中的每个项目都与特定用户在该日期的唯一访问相关。您可以通过以下方式确定唯一访问次数:

    visits.count()
    

    在本例中为 5。

    您还可以通过查看查询集中的 visits_on_date 字段来确定特定用户的访问次数。

    【讨论】:

    • 太棒了!谢谢。
    • 我无法得到这个答案来将日期时间截断为一个日期,因此无法让它过滤不同的日期。如果您希望从查询集中的对象中获取日期时间字段上存在的不同天数、周数或月数,您可能需要查看 dates() docs.djangoproject.com/en/1.11/ref/models/querysets/#dates
    猜你喜欢
    • 2013-08-16
    • 2016-07-10
    • 2014-03-10
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    相关资源
    最近更新 更多