Django 聚合:唯一字段的平均出现次数

Django aggregation: average occurrences over unique field

我对以下聚合感到头疼。我想获取平均设备在日期 x 和 y 之间检查的不同页面的数量。

模型的伪代码:

class Statistic:
    device_id = int
    date = date
    page_id = int

任何人都知道如何完成这个:

Statistic.objects.filter(date__gte=x,date__lte=y).???

更新:如果问题不清楚,这里有一个例子:

但是这样涉及到一个循环查询,每一个新查询device_id,显然效率不是很高。我正在寻找一种在 1-2 个查询中执行此操作的方法。

如果我对你的问题的理解正确,你想获得每个设备在 x 和 y 日期之间检查的平均页数,

为此你需要找到你可以这样做的独特设备的数量:

devices= Statistic.objects.filter(date__gte=x,date__lte=y).values('device_id').distinct().count()

现在求这个范围内的对象个数:

pages = Statistic.objects.filter(date__gte=x,date__lte=y).count()    
avg_pages_per_device = pages/devices

Statistic.objects.filter(date__gte=x, date__lte=y).distinct('device_id', 'page_id').values('device_id', 'page_id')

将为您提供查询集,显示设备访问过一次的页面,明确地(以独特的方式)并且只检索您想要的数据。

然后你可以使用Python来计算这个:

data = Statistic.objects.filter(date__gte=x, date__lte=y).distinct('device_id', 'page_id').values('device_id', 'page_id')
devices_set = set([d['device_id'] for d in data])
grouped = dict([(d, []) for d in devices_set])
for d in data:
    for g in grouped:
        if d['device_id'] == g:
            grouped[g].append(d['page_id'])

然后您在 Python 字典中拥有 deviced_id 访问过的所有唯一 page_id,您可以随心所欲。

由于您提供的模型似乎与其他模型无关,我不知道我们是否可以更好地优化 Queryset 以在数据库端进行操作,这很难。

如果我想清楚了,应该这样做:

Statistic.objects.filter(date__gte=x,date__lte=y).values('device_id').annotate(count=Count('device_id')).aggregate(avg=Avg('count'))