我正在为用户聊天创建一个私人用户,为了与某人聊天,所连接的用户必须输入用户的用户名,并与他想要在他自己的网址上进行交谈。如何向用户对话显示每个用户的最后一条消息以保存聊天记录?
既然这个系统已经建好了,我想保留一个聊天记录,以便稍后我可以发送聊天通知。为此,我需要获取每个对话的最后一条消息,并且我想在连接的用户自己的聊天档案中显示它。
正如下面的图片:
型号userComment
领域是:recipient
,sender
,comment
,sent_at
views.py:
def inbox(request, username):
username = User.objects.get(username=username)
connected_user = request.user
if username == connected_user:
#I'm having the issue on this line
users = userComment.objects.filter(Q(client=request.user) | Q(worker=request.user)).order_by(?)
else:
users = userComment.objects.filter(Q(Q(client=request.user) & Q(worker=username)) | Q(Q(client=username) & Q(worker=request.user))).order_by('sent_at')
models.py
class userComment(models.Model):
client = models.ForeignKey(User, related_name="client")
worker = models.ForeignKey(User, blank=True, null=True, related_name="worker")
sent_at = models.DateTimeField(auto_now_add=True)
comment = models.TextField(max_length=255, null=True)
def __str__(self):
return str(self.client)
问:如何才能筛选并订购我认为这样做呢?在额外按名称
user = request.user
users = User.objects.filter(Q(r__sender=user) | Q(s__recipient=user)).distinct().extra(select={'last_message_time': 'select MAX(sent_at) from appname_usercomment where (recipient_id=auth_user.id and sender_id=%s) or (recipient_id=%s and sender_id=auth_user.id)'}, select_params=(user.id, user.id,)).extra(order_by=['-last_message_time']).extra(select={'message': 'select comment from appname_usercomment where (sent_at=(select MAX(sent_at) from appname_usercomment where (recipient_id=auth_user.id and sender_id=%s) or (recipient_id=%s and sender_id=auth_user.id)) and ((recipient_id=auth_user.id and sender_id=%s) or (recipient_id=%s and sender_id=auth_user.id)))',}, select_params=(user.id, user.id,user.id, user.id,))
设置应用程序的名字:
不行的,这只能得到所有查询的最后一个项目。我希望它得到每个不同的消息集的最后一个项目,再加上如果它是由日期时间排序,然后有一个巨大的问题是,你可以在一个错误的收件箱中收到来自其他用户的消息。 – Lindow
@KasimovNuriddin请张贴UserComment在模型 – eskawl
我已经张贴模型 – Lindow