0

带有注释的查询集给了我这样的结果列表:

[{'completed__sum': 1, 'offer__count': 2, 'offer': 1}, {'completed__sum': 0, 'offer__count': 1, 'offer': 2}]  

我想得到这样的东西:

{1:{'completed__sum': 1, 'offer__count': 2},2:{'completed__sum': 0, 'offer__count': 1}}  

其中键12'offer': X字段的值。

将查询结果转换为所需形式的最快方法是什么?或者有没有办法以这种格式接收查询集的结果?


这是我的查询集:

Progress.objects.filter(user=self.request.user).values('offer').annotate(Count('offer')).annotate(Sum('completed'))

我的模型:

class Progress(models.Model):  
    user = models.ForeignKey(to=User)  
    offer = models.ForeignKey(to=Offer)  
    completed = models.BooleanField(default=False)  
4

2 回答 2

1

适用于 python 2.6 +

使用带有枚举的dict构造函数。

list_of_dicts = [
    {'completed__sum': 1, 'offer__count': 2, 'offer': 1},
    {'completed__sum': 0, 'offer__count': 1, 'offer': 2}]

dictionary = dict((d['offer'], dict((k, v) for k, v in d.items() if k != 'offer')) for d in list_of_dicts)

print dictionary
>>> 
{1: {'completed__sum': 1, 'offer__count': 2}, 2: {'completed__sum': 0, 'offer__count': 1}}

编辑:刚刚找到了一个更好的方法来做到这一点。如果您不再使用该列表并且只保留最终结果。

dictionary = dict((d.pop('offer'), d) for d in list_of_dicts)
于 2012-12-26T09:28:02.837 回答
0
>>> {x['offer']: dict(y for y in x.iteritems() if y[0] != 'offer') for x in [{'completed__sum': 1, 'offer__count': 2, 'offer': 1}, {'completed__sum': 0, 'offer__count': 1, 'offer': 2}]}
{1: {'completed__sum': 1, 'offer__count': 2}, 2: {'completed__sum': 0, 'offer__count': 1}}
于 2012-12-26T09:27:15.347 回答