Я думаю, что ты прав.Я не понимаю почему, но мне кажется, что ваш итератор groupby
проходит предварительную итерацию.Это проще объяснить с помощью кода:
>>> even_odd_key = lambda x: x % 2
>>> evens_odds = sorted(range(10), key=even_odd_key)
>>> evens_odds_grouped = itertools.groupby(evens_odds, key=even_odd_key)
>>> [(k, list(g)) for k, g in evens_odds_grouped]
[(0, [0, 2, 4, 6, 8]), (1, [1, 3, 5, 7, 9])]
Пока все хорошо.Но что происходит, когда мы пытаемся сохранить содержимое итератора в списке?
>>> evens_odds_grouped = itertools.groupby(evens_odds, key=even_odd_key)
>>> groups = [(k, g) for k, g in evens_odds_grouped]
>>> groups
[(0, <itertools._grouper object at 0x1004d7110>), (1, <itertools._grouper object at 0x1004ccbd0>)]
Конечно, мы только что кэшировали результаты, и итераторы все еще хороши.Правильно?Неправильно.
>>> [(k, list(g)) for k, g in groups]
[(0, []), (1, [9])]
В процессе получения ключей группы также перебираются.Итак, мы действительно просто кэшировали ключи и выбрасывали группы, сохраняя самый последний элемент.
Я не знаю, как django обрабатывает итераторы, но исходя из этого, я догадываюсь, что он кэширует их как списки внутри.Вы можете хотя бы частично подтвердить эту интуицию, выполнив вышеизложенное, но с большим количеством ресурсов.Если единственный отображаемый ресурс является последним, то вы почти наверняка столкнулись с проблемой, описанной выше.