Django ManyToMany relation — как сделать выборку по AND?

Здравствуйте.
Возможно, кому-то покажется это банальностью, но есть следующая задачка:

Есть моделька:

class Room(models.Model):
    users = models.ManyToManyField(User, related_name='speakers')
    ....


Никак не могу понять как сделать через ORM или даже через SQL (одним словом не питонячей логикой) такую выборку:
нужен тот Room в котором есть 2 разных пользователя и только они.
То есть кейс:
Room1 - у которой users = [user1,user2,user3]
Room2 - у которой users = [user1,user3]
Room3 - у которой users = [user1,user2]

Допустим мне нужно найти только те комнаты в которых есть user1 и user2, то есть только Room3.
Через __in ессно будет не то, через Q() & Q() - тоже.

Если кто знает решение на SQL - поделитесь. База PG9.1

Пока нашел только такое кривое решение:
SELECT * FROM (
SELECT messages_rooms_users.room_id, COUNT(messages_rooms_users.room_id) as ctx from messages_rooms_users
WHERE
messages_rooms_users.user_id in (__users_id_list__)
GROUP BY messages_rooms_users.room_id) as subq
WHERE subq.ctx = 2


Может, кто подскажет.
  • Вопрос задан
  • 2912 просмотров
Решения вопроса 1
mututunus
@mututunus
Backend developer (Python, Golang)
from django.db.models import Count
Room.objects.annotate(num_users=Count('users').filter(users=user1).filter(users=user2, num_users=2)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы