Агрегированный запрос django manytomany field

Я пытаюсь сделать приложение для чата, где для экрана, где виден список сообщений пользователей, как Home Screen в WhatsApp или Telegram.

Для чего мне может понадобиться ID чата, имя отправителя. (в основном)'

Я установил свои модели следующим образом

models.py

class ChatRoom(models.Model):
    name = models.CharField(max_length=50)
    last_message = models.CharField(max_length=1024, null=True)
    last_sent_user = models.ForeignKey(User, on_delete=models.PROTECT, null=True)

    def __str__(self):
        return self.name


class Messages(models.Model):
    room = models.ForeignKey(ChatRoom, on_delete=models.PROTECT)
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    content = models.CharField(max_length=1024)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.content


class ChatRoomParticipants(models.Model):
    user = models.ManyToManyField(User, related_name='chatroom_users')
    room = models.ForeignKey(ChatRoom, on_delete=models.PROTECT)

Откуда я делаю запрос в ChatRoomParticipants, чтобы увидеть, к скольким ChatRoom(s) подключен пользователь. В ChatRoomParticipants пользователь имеет связь с пользователями, которые подключены к данному конкретному room.

Для отображения имени, последнего сообщения и идентификатора чат-рума в мобильном приложении я написал следующий запрос.

chatrooms = list(ChatRoomParticipants.objects.filter(user=user).values('id','room__id', 'room__name', 'room__last_message', 'room__last_sent_user', 'user__chatroom_users__user__username'))

Но это дает мне повторный неожиданный вывод, который я не могу понять

Ниже я показываю, какие 2 пользователя связаны с какой комнатой

Значения базы данных

room - f4253fbd-90d1-471f-b541-80813b51d610-99ea24b1-2b8c-4006-8970-2b4f25ea0f40
relations to - udaykhalsa9 and udaykhalsa7



room - f4253fbd-90d1-471f-b541-80813b51d610-872952bb-6c34-4e50-b6fd-7053dfa583de
relations to - udaykhalsa9 and udaykhalsa

Ниже я вижу неожиданный результат, где третий пользователь появляется в результатах с номером, к которому он не имеет отношения.

Выход

[
    {
        "id": 6,
        "room__id": 6,
        "room__name": "f4253fbd-90d1-471f-b541-80813b51d610-99ea24b1-2b8c-4006-8970-2b4f25ea0f40",
        "room__last_message": "iijh",
        "room__last_sent_user": "f4253fbd-90d1-471f-b541-80813b51d610",
        "user__chatroom_users__user__username": "udaykhalsa7"
    },
    {
        "id": 6,
        "room__id": 6,
        "room__name": "f4253fbd-90d1-471f-b541-80813b51d610-99ea24b1-2b8c-4006-8970-2b4f25ea0f40",
        "room__last_message": "iijh",
        "room__last_sent_user": "f4253fbd-90d1-471f-b541-80813b51d610",
        "user__chatroom_users__user__username": "udaykhalsa9"
    },
    {
        "id": 6,
        "room__id": 6,
        "room__name": "f4253fbd-90d1-471f-b541-80813b51d610-99ea24b1-2b8c-4006-8970-2b4f25ea0f40",
        "room__last_message": "iijh",
        "room__last_sent_user": "f4253fbd-90d1-471f-b541-80813b51d610",
        "user__chatroom_users__user__username": "udaykhalsa"
    },
    {
        "id": 5,
        "room__id": 4,
        "room__name": "f4253fbd-90d1-471f-b541-80813b51d610-872952bb-6c34-4e50-b6fd-7053dfa583de",
        "room__last_message": "jsjdnd",
        "room__last_sent_user": "f4253fbd-90d1-471f-b541-80813b51d610",
        "user__chatroom_users__user__username": "udaykhalsa7"
    },
    {
        "id": 5,
        "room__id": 4,
        "room__name": "f4253fbd-90d1-471f-b541-80813b51d610-872952bb-6c34-4e50-b6fd-7053dfa583de",
        "room__last_message": "jsjdnd",
        "room__last_sent_user": "f4253fbd-90d1-471f-b541-80813b51d610",
        "user__chatroom_users__user__username": "udaykhalsa9"
    },
    {
        "id": 5,
        "room__id": 4,
        "room__name": "f4253fbd-90d1-471f-b541-80813b51d610-872952bb-6c34-4e50-b6fd-7053dfa583de",
        "room__last_message": "jsjdnd",
        "room__last_sent_user": "f4253fbd-90d1-471f-b541-80813b51d610",
        "user__chatroom_users__user__username": "udaykhalsa"
    }
]
Вернуться на верх