python - 如何通过相关项的条件聚合对 Django 查询集进行排序?

标签 python django sorting django-queryset django-orm

如何使用 Django ORM 通过相关项目的条件聚合对查询集中的所有对象进行排序? Django 1.8 及更高版本明确具有 conditional aggregation support ,我需要 Django < 1.8 的答案。这显然会涉及 3 或 4 个查询。以下是回答者可以用来说明她的答案的示例模型:

class Group(models.Model):
    owner = models.ForeignKey(User)
    created_at = models.DateTimeField(auto_now_add=True)

class GroupTraffic(models.Model):
    visitor = models.ForeignKey(User)
    which_group = models.ForeignKey(Group)
    time_of_visit = models.DateTimeField(auto_now_add=True)

用户拥有自己的聊天组,其他用户可以访问该聊天组。要回答的问题是:如何生成一个包含所有 组的排序列表,使其按每个组在过去 60 年中看到的独特流量排序分钟?在过去 60 分钟内看到大量独立访客的​​组被排在顶部,此类流量几乎为零(或零)的组出现在列表底部。

这是一个条件聚合问题,因为从本质上讲,我们需要为每个组对象注释过去 60 分钟内记录的所有相关的、唯一的组流量对象的计数。

有人可以告诉我如何使用 Django ORM 解决 < 1.8 的这个问题吗?我已经知道如何通过条件聚合(感谢 this )为 >= 1.8 做到这一点,我不想通过原始或额外的 SQL 查询来做到这一点。

最佳答案

只需过滤 time_of_visit,它应该可以正常工作:

one_hour_ago = datetime.now()-timedelta(hours=1)
recent_groups = Group.objects.filter(grouptraffic__time_of_visit>=one_hour_ago)
visitors = recent_groups.annotate(views=Count('grouptraffic__visitor', distinct=True))

然后获取所有旧组,为空 View 添加一个extra字段:

older_groups = Group.objects.filter(grouptraffic__time_of_visit < one_hour_ago).extra(select={'visits':0})

然后用管道将它们连接在一起:

all_groups = visitors | older_groups 

关于python - 如何通过相关项的条件聚合对 Django 查询集进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33817200/

相关文章:

python - 溢出错误: cannot fit 'int' into an index-sized integer

python - 在 django_simple_history 中使用 prefetch_related

python - Django:从 Form clean 方法调用自定义模型方法。 "Unbound Method"?

java - 使用 System.out.println 输出后可以更改一行吗?

python - matplotlib 艺术家动画 : title or text not changing

python - http客户端需要访问nginx两次才能加载css文件

python - Pandas 用列表设置单元格的值范围

python - 此错误或一直显示 : integrityError, UNIQUE 约束失败 : blog_post.author_id

algorithm - 计数排序——效率

r - ggplot2 的facet_grid 内部元素中具有多个重复值的不同重新排序