Модель чата 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;