Distinct может быть неправильным словом для того, что я хочу, но у меня есть класс Message
, подобный следующему для простой плоской системы обмена сообщениями между пользователями:
class Message(models.Model):
thread = models.ForeignKey(Thread)
from_user = models.ForeignKey(User, related_name='messagefromuser')
to_user = models.ForeignKey(User, related_name='messagetouser')
when = models.DateTimeField(auto_now_add=True)
message = models.TextField()
Это позволяет двум пользователям общаться в чате об одном объекте Thread. Система предназначена для того, чтобы два пользователя могли вести разные разговоры в разных темах.
Таким образом, я могу получить сообщения, в которые вовлечен данный пользователь, с помощью следующего запроса:
Message.objects.filter( Q(from_user=u) | Q(to_user=u) )
Выводит каждое сообщение, отправленное или полученное пользователем. Я создаю страницу, где пользователи могут видеть все свои разговоры с другими пользователями, сгруппированные по темам. Это идеальный вывод, который я могу себе представить:
[
{
'thread': thread_instance,
'conversations': [
{
'other_user': user_instance
'latest_reply': date_time_instance
},
....
]
},
...
]
Я думал об итерации сверху, но если нет способа отфильтровать Thread
в to_user
, *1017*, from_user
полях, слишком много потоков. Сервер БД растаял бы.
- "Группировать" сообщения по
Thread
- «Сгруппировать» группы другого пользователя, чтобы каждая группа находилась между двумя разными пользователями, на
Thread
- Выберите самое последнее
to_user=u
и что-то комментируйте.
Я немного схожу с ума, пытаясь исказить мой мозг вокруг деталей. В моей голове кажется, что вы должны быть в состоянии сделать несколько строк, но я просто не понимаю, как это сделать.