• Почему цикл внезапно обрывается?

    @Nuchimik
    wolverine777, Не полностью уверен, но процентов на 90.

    Внутри цикла for происходит получение итератора для рассматриваемого списка.
    Следующий элемент последовательности в итераторе получается вызовом метода next(), который возвращает элемент с индексом, следующим за предыдущим.
    Итератор же имеет лишь ссылку на объект и не создает копию. Таким образом, изменение списка (в вашем случае удаления элементов) изменяет и длину списка, а следовательно и конечный индекс.

    Цикл for заканчивается когда метод next() вызовет исключение StopIteration. Полагаю, что это исключение наследуется от IndexError. Т.е. индекс есть, а элемента в списке под этим индексом нет, и цикл заканчивается, оставив ваш исходный список не до конца удаленным, а результат не до конца рассчитанным.

    P.s. Если вам помог мой ответ, отметьте его пожалуйста. Спасибо
  • Как здесь правильно использовать OuterRef?

    @Nuchimik
    reqww, И на счет этого. Тебе нужно не код упростить, а саму логику. Структурировать ее, декомпозировать, если нужно. После этого уже составить запрос по частям
  • Как здесь правильно использовать OuterRef?

    @Nuchimik
    reqww, Тебе не нужно это. Во-первых, тебе нужно понять, что запросы в Джанго - ленивые. Это значит, что они будут выполняться только тогда, когда реально понадобятся данные. Во-вторых, вытекает из первого, ты можешь разбить свои выборки на части. Так и тебе проще будет, и опрятнее будет выглядеть.
    Ну и в-третьих, попробуй заменить
    chat=Subquery(Chat.objects.get(
        participants__in=[self.request.user, OuterRef(OuterRef('id'))],
        is_chat=True
    ))

    На
    from django.db.models import Q
    Q(Q(chat__participants=self.request.user) | Q(chat__participants__pk=OuterRef('id')))

    Только помни, что сначала неименованные аргументы, а потом именованные. И да, уверен, что это не сделает твой код рабочим. Это показ того, как нужно обойти ту ошибку, которую ты получил
  • Как здесь правильно использовать OuterRef?

    @Nuchimik
    В любом случае проблема в том, что ты отдаешь список для фильтрации, в котором ожидаются уже значения, а не ссылки на поля. И два раза OuterRef не сработает. Слишком большая вложенность. Не думаю, что это нужно. Ты можешь добраться до нужных полей через связи
  • Как здесь правильно использовать OuterRef?

    @Nuchimik
    Nuchimik, а, я понял)) Твой запрос нужно упростить