7

次のクエリがあります

a = Mainfee.objects.values('collected_by__username').
                       distinct().annotate(Sum('amount'))

結果はこんな感じ

[{'collected_by__username': u'maindesk', 'amount__sum': 800}]

a最初のキーの名前を に、2 番目のキーの名前を に変更するにはどうすればよいbですか?

私は次のことを試しました

m = Mainfee.objects.extra(select = 
   {'a':'collected_by__username'}).values('a').distinct().
    annotate(Sum('amount'))

そしてこれを受け取った

DatabaseError: no such column: collected_by__username

私も試しました

m = Mainfee.objects.extra(select = 
   {'a':'collected_by__username'}).values('collected_by__username').distinct().
    annotate(Sum('amount'))

そして得た

[{'collected_by__username': u'maindesk', 'amount__sum': 800}]

PS: 2 番目のフィールドの名前も変更したい

4

4 に答える 4

13

キーワード引数を使用して、注釈付きの値の辞書キーを変更できます。

m = Mainfee.objects.values('collected_by__username').annotate(b=Sum('amount'))

[{'collected_by__username': u'maindesk', 'b': 800}]

ただし、関連するフィールドの名前をすばやく簡単に変更する方法はありません。Python で変換できますが、それが本当に必要かどうかを自問する必要があります。

m = Mainfee.objects.values('collected_by__username').annotate(b=Sum('amount'))
m = [{'a': x['collected_by__username'], 'b': x['b']} for x in m]

または、これは少し速いかもしれません:

m = Mainfee.objects.values_list('collected_by__username').annotate(Sum('amount'))
m = [{'a': x[0], 'b': x[1]} for x in m]

もちろん、両方のメソッドはクエリセット全体の評価を強制し、クエリセットのメソッドを介したさらなるフィルタリング/順序付けなどを許可しません。

また、またはを と一緒にdistinct()使用している場合、 への呼び出しは冗長であることに注意してください。values()values_list()annotate()

于 2013-08-09T11:10:11.463 に答える
9

F()次の式を使用できますcollected_by__username

F()オブジェクトは、モデル フィールドまたは注釈付き列の値を表します。モデルフィールド値を参照し、それらを実際にデータベースからPythonメモリに引き出すことなく、それらを使用してデータベース操作を実行F()できます...モデルに動的フィールドを作成するために使用できます...

これをannotate句の中で行うと、フィールドを に「名前変更」できますaF()合計を計算するときに式を使用する必要はありません。下記参照:

from django.db.models import F
    
(Mainfee.objects.values('collected_by__username')
    .annotate(a=F('collected_by__username'), b=Sum('amount'))
    .values('a', 'b'))

モデルについていくつかの仮定を立てると、次のようになります。

<QuerySet [{'a': 'item1', 'b': 1234}, {'a': 'item2', 'b': 4321}]>
于 2019-04-25T07:50:29.250 に答える
0

最初のキーの名前を変更する方法がわかりません。ここに解決策があるようです: How to rename items in values() in Django? ただし、生成された SQL は次のようになるため、この場合はエラーが返されます。

SELECT collected_by__username AS a WHERE ...

そしてもちろんcollected_by__username存在しません。

注: この機能はこちらでリクエストされています https://code.djangoproject.com/ticket/16735

2 番目のキーは、次を使用して名前を変更できます。annotate(b=Sum('amount')

最初にこれを試してください:

m = (Mainfee.objects
     .extra(select={'a': 'collected_by.username'})  # check your DB for the exact table and field name
     .values('a')
     .distinct()
     .annotate(b=Sum('amount')))

例外が吐き出されると思いますが、試してみる価値があります。それ以外の場合は、最初のキーの名前を変更しようとしないでください。

それが役に立てば幸い。

于 2013-08-09T11:09:29.770 に答える
-1

誰かがこのページにつまずいた場合に備えて。

m = Mainfee.objects.extra(select = 'a':'collected_by.username'}).values('collected_by__username','a').distinct().annotate(b=Sum('amount'))
于 2016-06-29T15:39:17.087 に答える