Аннотация запроса Django после фильтра работает некорректно

У меня есть две модели, связанные с помощью m2m отношения через промежуточную модель. Поле отношения называется participants.

Когда я делаю это:

chats = Chat.objects.annotate(Count("participants")).filter(participants=user)
chats.get(pk=11).participants__count

Он вернет 2; что правильно. Но когда я делаю следующее:

chats = Chat.objects.filter(participants=user).annotate(Count("participants"))
chats.get(pk=11).participants__count

Он вернет 1. И не только для этого объекта, но и для всех объектов в наборе запросов.

Что не так? Что я делаю неправильно? Мне нужно аннотировать отфильтрованный набор запросов.

Я нашел ответ на эту проблему в Django docs.

Очевидно:

filter() и annotate() не являются коммутативными операциями.

Мне приходится сначала аннотировать все объекты, а затем использовать фильтр на них; чтобы почти получить то, что я хочу.

Но я все еще не знаю, что мне делать, если я хочу аннотировать queryset, который не находится непосредственно в менеджере модели.

Вернуться на верх