[英]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.