繁体   English   中英

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

[英]How to sort a Django queryset by a conditional aggregation of related items?

如何使用Django ORM通过相关项的条件聚合对查询集中的所有对象进行排序? Django 1.8及更高版本显然有条件聚合支持 ,我需要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分钟内记录的所有相关的,唯一的grouptraffic对象的Count。

有人可以告诉我如何使用Django ORM解决这个问题<1.8? 我已经知道如何通过条件聚合来实现> = 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))

然后获取所有较旧的组,并为空视图添加一个extra字段:

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

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

all_groups = visitors | older_groups 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM