wolverine777, Не полностью уверен, но процентов на 90.
Внутри цикла for происходит получение итератора для рассматриваемого списка.
Следующий элемент последовательности в итераторе получается вызовом метода next(), который возвращает элемент с индексом, следующим за предыдущим.
Итератор же имеет лишь ссылку на объект и не создает копию. Таким образом, изменение списка (в вашем случае удаления элементов) изменяет и длину списка, а следовательно и конечный индекс.
Цикл for заканчивается когда метод next() вызовет исключение StopIteration. Полагаю, что это исключение наследуется от IndexError. Т.е. индекс есть, а элемента в списке под этим индексом нет, и цикл заканчивается, оставив ваш исходный список не до конца удаленным, а результат не до конца рассчитанным.
P.s. Если вам помог мой ответ, отметьте его пожалуйста. Спасибо
reqww, И на счет этого. Тебе нужно не код упростить, а саму логику. Структурировать ее, декомпозировать, если нужно. После этого уже составить запрос по частям
reqww, Тебе не нужно это. Во-первых, тебе нужно понять, что запросы в Джанго - ленивые. Это значит, что они будут выполняться только тогда, когда реально понадобятся данные. Во-вторых, вытекает из первого, ты можешь разбить свои выборки на части. Так и тебе проще будет, и опрятнее будет выглядеть.
Ну и в-третьих, попробуй заменить
from django.db.models import Q
Q(Q(chat__participants=self.request.user) | Q(chat__participants__pk=OuterRef('id')))
Только помни, что сначала неименованные аргументы, а потом именованные. И да, уверен, что это не сделает твой код рабочим. Это показ того, как нужно обойти ту ошибку, которую ты получил
В любом случае проблема в том, что ты отдаешь список для фильтрации, в котором ожидаются уже значения, а не ссылки на поля. И два раза OuterRef не сработает. Слишком большая вложенность. Не думаю, что это нужно. Ты можешь добраться до нужных полей через связи
Внутри цикла
for
происходит получение итератора для рассматриваемого списка.Следующий элемент последовательности в итераторе получается вызовом метода
next()
, который возвращает элемент с индексом, следующим за предыдущим.Итератор же имеет лишь ссылку на объект и не создает копию. Таким образом, изменение списка (в вашем случае удаления элементов) изменяет и длину списка, а следовательно и конечный индекс.
Цикл
for
заканчивается когда методnext()
вызовет исключениеStopIteration
. Полагаю, что это исключение наследуется отIndexError
. Т.е. индекс есть, а элемента в списке под этим индексом нет, и цикл заканчивается, оставив ваш исходный список не до конца удаленным, а результат не до конца рассчитанным.P.s. Если вам помог мой ответ, отметьте его пожалуйста. Спасибо