Django 1.7, как получить доступ к значениям после аннотации

Я использую 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'))

person fizzyh2o    schedule 21.01.2015    source источник
comment
И когда я перебираю ValueSet, он перебирает все 49 сообщений.   -  person fizzyh2o    schedule 21.01.2015


Ответы (1)


Похоже, вы изменили messages в коде «сделать что-то здесь» или после первой итерации.

person catavaran    schedule 21.01.2015