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 +で動作します

enumerateで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 に答える