我的模型定义类似于下面的
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)