次のようなレコード セットがあります (退屈しやすい人を保護するために不要なデータは省略されています)。
id | user_id | created | units
----+---------+-------------------------------+-------
1 | 1 | 2011-04-18 15:43:02.737063+00 | 20
2 | 1 | 2011-04-18 15:43:02.737063+00 | 4
3 | 1 | 2011-04-18 15:46:48.592999+00 | -1
4 | 1 | 2011-04-19 12:02:10.687587+00 | -1
5 | 1 | 2011-04-19 12:09:20.039543+00 | -1
6 | 1 | 2011-04-19 12:11:21.948494+00 | -1
7 | 1 | 2011-04-19 12:15:51.544394+00 | -1
8 | 1 | 2011-04-19 12:16:44.623655+00 | -1
そして、私は次のような結果を得たいと思っています:
id | user_id | created | units
----+---------+-------------------------------+-------
8 | 1 | 2011-04-19 12:16:44.623655+00 | 14
2 | 1 | 2011-04-18 15:43:02.737063+00 | 4
だから私は自然に次のことを考えてい.annotate()
ます:
u = User.objects.get(pk=1)
(MyModel.objects.filter(user=u)
.values("id","user","created")
.annotate(stuff=Sum("units"))
)
問題は、辞書の単一のリストではなく、objectsが必要なことです。これらのオブジェクトにアタッチされたメソッドを利用できるようにする必要があります。これを行う方法についてのアイデアはありますか?
編集: .values() を使用しようとしたことを指摘する必要がありました。これがないと、注釈付きオブジェクトの束が問題なく取得されますが、(上記の最初のクエリのように) 2 つではなく (上記の最初のクエリのように) 8 つになるためです。上記の 2 番目の結果)。私の推測では、そこにタイムスタンプがあり、行が異なるため、行を結合していないということです:
MyModel.objects.filter(user=u).annotate(Sum("units"))
# Returns 8 records, not 2 as expected