将django值降低到每个值的计数

时间:2016-04-20 22:33:09

标签: django postgresql django-queryset

我的模型定义类似于下面的

class MyModel(models.Model):
    num_attempts = models.IntegerField()
    num_generated = models.IntegerField()
    num_deleted = models.IntegerField()

假设我的数据看起来像这样:

 |id|num_attempts|num_generated|num_deleted
  1  1            2              0
  2  2            0              1
  3  3            2              1
  4  3            1              2

我希望得到每个可能字段的每个可能值的实例计数。

例如,返回样本可能如下所示。

{
 'num_attempts_at_1': 1,
 'num_attempts_at_2': 1,
 'num_attempts_at_3': 2,
 'num_generated_at_0': 1,
 'num_generated_at_1': 1,
 'num_generated_at_2': 2,
 'num_deleted_at_0': 1,
 'num_deleted_at_1': 2,
 'num_deleted_at_2': 1
} 

上面的例子假设很多,比如之后变量的命名以及它将被序列化。这些都不重要,而是我如何从数据库中分解出来。如果可能的话,最好在一个查询中完成此操作。

我们使用Postgres作为数据库。

这是排序靠近,但并不完全。

qs.values_list('num_attempts','num_generated','num_deleted').annotate(Count('id'))

给出(与上述示例不同的数据)

[{'num_attempts': 4, 'id__count': 3, 'num_deleted': 3, 'num_generated': 6}, {'num_attempts': 3, 'id__count': 12, 'num_deleted': 2, 'num_generated': 2}, {'num_attempts': 2, 'id__count': 5, 'num_deleted': 0, 'num_generated': 6}]

现在有了一些自定义python,我能够做到这一点,但如果可能的话,我真的想要一个数据库解决方案。

def get(self, request, *args, **kwargs):
    qs = self.get_queryset()
    return_data = {}
    for obj in qs:
        count = obj.pop('id__count')
        for k, v in obj.items():
            key = "{}_at_{}".format(k, v)
            value = return_data.get(key, 0) + count
            return_data[key] = value
    return Response(return_data)

0 个答案:

没有答案