Нужна помощь в переписывании необработанного 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")
)
Вернуться на верх