Модель чата Django: Получение последних сообщений из всех комнат, в которых состоит пользователь

У меня возникают трудности с построением запроса (sqlite) для получения последнего сообщения для каждого чата, в котором участвует пользователь. Это моя модель на Django:

class Membership(models.Model):
    room_name = models.TextField()
    members = models.ManyToManyField(CustomUser, through="Message")

class Message(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    room = models.ForeignKey(Membership, on_delete=models.CASCADE)
    advertisement = models.ForeignKey(Advertisement, on_delete=models.CASCADE, default=None)
    message = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

class CustomUser(AbstractUser):
    username = models.CharField(max_length=200, unique=False)

Теперь я хотел бы отобразить все комнаты, в которых находится пользователь, и, кроме того, последнее сообщение в комнате. Мне кажется, что я уже близко:

select *
from chat_message as cm
inner join (select max(id) as lm from chat_message group by room_id) as last_messages on last_messages.lm = cm.id
inner join main_advertisement ma on cm.advertisement_id = ma.id
inner join chat_membership as cmb ON cm.room_id = cmb.id
order by id;

Как видно, это дает мне последние сообщения (и другие данные) для каждой комнаты, но теперь мне трудно отфильтровать только 1 пользователя (например, user_id = 3).

Будем признательны за любые идеи, а также за возможные подсказки, как начать строить это в django ORM.

Вы можете добавить фильтр к вашему внутреннему запросу, где вы получите максимальное количество chat_message идентификаторов:

select *
from chat_message as cm
inner join (select max(id) as lm from chat_message where user_id = 3 group by room_id) as last_messages on last_messages.lm = cm.id
inner join main_advertisement ma on cm.advertisement_id = ma.id
inner join chat_membership as cmb ON cm.room_id = cmb.id
order by id;
Вернуться на верх