Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过相关项的条件聚合对Django查询集进行排序?_Python_Django_Sorting_Django Queryset_Django Orm - Fatal编程技术网

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

Python 如何通过相关项的条件聚合对Django查询集进行排序?,python,django,sorting,django-queryset,django-orm,Python,Django,Sorting,Django Queryset,Django Orm,如何使用Django ORM通过相关项的条件聚合对queryset中的所有对象进行排序?Django 1.8和更高版本明确地有,我需要一个关于Django

如何使用Django ORM通过相关项的条件聚合对queryset中的所有对象进行排序?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对象的计数


有人能告诉我如何使用Django ORM来解决<1.8的问题吗?我已经知道如何通过条件聚合为>=1.8执行此操作(多亏了),我不想通过原始或额外的SQL查询执行此操作。

只需在访问的
时间进行筛选,它应该可以正常工作:

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))
然后获取所有较旧的组,并为空视图添加一个
额外的
字段:

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

对于唯一流量,我的意思是,如果是具有相同ID的访客,则不重复计算。例如,在Django ORM中使用
distinct
。到目前为止,您尝试了哪些查询?大列表人,请稍候,我将在此处放置一些最接近的查询。查询1:此查询不考虑最近60分钟的流量:
组=组。对象。注释(views=Count('grouptraffic\uu visitor',distinct=True))
。查询2:这些不考虑所有组:date=
datetime.now()-timedelta(hours=1)
new\u trafff=grouptraffic.objects.filter(time\ugte=date,其中\u group\uu private='0')。distinct('visitor')。值列表('id',flat=True)
trendingGrp\u id=GroupTraffic.objects.filter(id\u in=new\u traff).值('which\u group')。注释(total=Count('which\u group')).order\u by('-total')
trendingGrps=[group.objects.filter(id=grp['which\u group'])。额外(选择={“视图”:grp['total']})[0]用于trendingGrp\u id中的grp]
返回趋势GRP
这不包括在过去一小时内没有记录访问的组吗?我想包括所有组,只是过去一小时内没有访问的组应该排在最后。好的,还有一个要求是首先按最热门组对列表进行排序。我应该直接在最后是“所有组”。这应该行。如果不行,你可以对每个查询单独排序,然后合并。好吧,不管是哪种方式。我只是想了解一下这一点,从逻辑上讲,这是可行的。我会稍后再报告。顺便说一句,这将是
所有组=访客|较老的组
,不是吗?
all_groups = visitors | older_groups