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

时间:2016-05-11 14:12:23

标签: django django-queryset django-1.8

我在以下聚合中突破了我的头脑。我想获得普通设备在日期x和y之间检查​​的不同页面的数量。

模型的伪代码:

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

任何人都知道如何完成此任务:

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

更新:如果问题不明确,这是一个例子:

  • 获取表格中出现的所有唯一device_id值。
  • 对于每个唯一的device_id值,计算表中出现的唯一page_id值的数量。将这些值添加到列表中。
  • 计算该列表的平均值。

但这涉及循环中的查询,每个device_id的新查询,这显然不是很有效。我正在寻找一种方法来做1-2次查询。

3 个答案:

答案 0 :(得分:1)

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

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

然后你可以用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 dict中拥有page_id访问过的所有唯一deviced_id,您可以随意执行任何操作。

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

答案 1 :(得分:0)

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

为此你需要找到许多独特的设备,你可以这样做:

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

现在找到此范围内的对象数量:

(function() {
function getLabelStrForIndPlan(ind, plan) {
  if (ind === 'Y' && plan === 'State') {
    return 'yes';
  }
  else if (ind === 'N' && plan === 'Another State') {
    return 'no';
  }
}

function abc(Input){
  return function(value){
    for(var i=0; i<3; i++){
      var fpwInd = Input[i].fpwInd;
      var label = getLabelStrForIndPlan(fpwInd, fpw.plan);

      if (label) {
        fpwValues.push(weblService.returnLabel(label, $rootScope.label));
        break;
      }
    }
  }
}
})();

答案 2 :(得分:0)

If I'm thinkin clear, this should do it:

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