Аннотация запроса 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, который не находится непосредственно в менеджере модели.