我有一个看起来像这样的记录集(省略了无关数据以保护容易无聊的人):
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() 因为没有它我会得到一堆带注释的对象,但是会有 8 个(如上面的第一个查询),而不是 2 个(如上面的第二个结果)。我的猜测是它没有合并行,因为那里有一个时间戳使行不同:
MyModel.objects.filter(user=u).annotate(Sum("units"))
# Returns 8 records, not 2 as expected