У меня есть набор записей, который выглядит следующим образом (посторонние данные опущены, чтобы защитить легко скучающих):
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"))
)
Проблема в том, что мне нужны объекты , а не один список словарей. Мне нужно, чтобы методы, прикрепленные к этим объектам, были доступны. Есть идеи, как это сделать?
Редактировать :
Я должен был указать, что я пытался использовать .values (), потому что без него я бы получил кучу аннотированных объектов, но их было бы 8 (как в первом запросе выше), а не 2 (как во втором результат выше). Я предполагаю, что он не объединяет строки, потому что там есть временная метка, делающая строки разными:
MyModel.objects.filter(user=u).annotate(Sum("units"))
# Returns 8 records, not 2 as expected