Агрегированный запрос 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"
}
]