Я использую Django 1.7 и пытаюсь выполнить запрос агрегации. Похоже, что они работают, пока я не перебираю ValueSet.
>> messages = Message.objects.filter(is_outgoing=False)
.values('contact_id').annotate(Max('created')
>> messages.count()
5
Это верно. Всего 5 уникальных контактов.
Однако, как только я это сделаю:
for m in messages:
do stuff here
Теперь, когда я делаю messages.count(), я получаю 49, что является общим количеством сообщений, не сгруппированных клиентом.
Как я могу перебрать ValueSet и получить только 5 самых последних сообщений?
Редактировать:
Я узнал, что происходит. У меня было установлено для Meta.ordering значение «-created» в классе Message. Это означает, что ORM добавляла группу при создании, поэтому генерируемый запрос группировался как по «создано», так и по «contact_id».
Я добавил order_by() перед annotate(), чтобы удалить порядок по умолчанию, и это решило проблему.
messages = Message.objects.filter(is_outgoing=False)
.values('contact_id').order_by().annotate(Max('created'))