Нужна помощь в переписывании необработанного SQL, содержащего подзапрос select from с последующим join, в Django ORM
У меня есть следующая модель сообщения:
class Message(models.Model):
sender = models.ForeignKey(
to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name="outgoing_messages",
verbose_name=_("sender"),
)
recipient = models.ForeignKey(
to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name="incoming_messages",
verbose_name=_("recipient"),
)
text = NormalizedTextField(verbose_name=_("text"), max_length=4096)
date = models.DateTimeField(verbose_name=_("date/time"), auto_now_add=True)
Мне нужно получить всех пользователей, с которыми текущий пользователь находится в чате, при этом отображая текст и дату последнего сообщения.
Вот SQL, который мне нужно переписать в Django ORM (%s - id текущего пользователя):
SELECT
message.id,
message.text,
message.date,
message.interlocutor_id,
users_user.username AS interlocutor_username,
users_user.image AS interlocutor_image
FROM
(
SELECT DISTINCT
ON (interlocutor_id) messenger_message.id,
messenger_message.text,
messenger_message.date,
CASE
WHEN messenger_message.sender_id = %s THEN messenger_message.recipient_id
ELSE messenger_message.sender_id
END AS interlocutor_id
FROM
messenger_message
WHERE
(
messenger_message.sender_id = %s
OR messenger_message.recipient_id = %s
)
ORDER BY
interlocutor_id,
messenger_message.id DESC
) message
JOIN users_user ON users_user.id = message.interlocutor_id
Мне удалось переписать подзапрос (который я назвал "messages" в SQL выше), но я не знаю, как соединить его с другой таблицей и получить необходимые данные.
messages = (
models.Message.objects.filter(
Q(sender=request.user) | Q(recipient=request.user)
)
.annotate(
interlocutor_id=Case(
When(sender=request.user, then=F("recipient")),
default=F("sender"),
)
)
.order_by("interlocutor_id", "-pk")
.distinct("interlocutor_id")
)