Отличительный может быть неправильным словом для того, что я хочу, но у меня есть класс 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
, from_user
Message
, потоков слишком много. Сервер БД растает.
- "Группировать" сообщения по
Thread
- "Группировать" группы другого пользователя, чтобы каждая группа находилась между двумя отдельными пользователями, за
Thread
- Возьмите самый последний
to_user=u
и аннотируйте что-нибудь с ним.
Я немного схожу с ума, пытаясь прокрутить свой мозг вокруг подробностей. В моей голове кажется, что вы должны быть в состоянии сделать пару строк, но я просто не понимаю, как это сделать.
Thread
на самом деле вообще не предназначен для обмена сообщениями. Это объект, который в какой-то момент сгенерирует один из двух пользователей в беседе. После создания другой пользователь может начать разговор с владельцем потока, а затем владелец может ответить. Если бы система была StackOverflow,Thread
был бы вопросом, а Message был бы своего рода частной системой комментариев, обсуждающей вопрос. - person Oli   schedule 15.04.2011Thread
иMessage
, называемыйMessageThread
, чтобы создать служебный буфер между ними (точно так же, как это сделал бы настоящий поток обмена сообщениями). Система очень молода, поэтому я все еще могу позволить себе очистить данные, если это упростит задачу. - person Oli   schedule 15.04.2011MessageThread
наверное хорошая идея - person OmerGertel   schedule 17.04.2011