如何在用户对话中显示每个用户的最新消息以保持聊天记录?

努里裕之

我正在创建一个私人用户进行用户聊天,为了与某人聊天,已连接用户必须在自己的URL上输入要与之对话的用户的用户名。

现在已经建立了该系统,我想保留聊天记录,以便以后可以发送聊天通知。为此,我需要获取每个对话的最后一条消息,并将其显示在连接的用户自己的聊天个人资料上。

如下图所示:

在此处输入图片说明

型号 userComment字段有:recipientsendercommentsent_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)

问题:如何过滤和排序视图?

普拉纳夫·阿格瓦尔

首先,在userComment模型中添加相关查询名称以实现反向关系

class UserComment(models.Model):
    sender = models.ForeignKey(User, related_name='sender', related_query_name='s')
    recipient = models.ForeignKey(User, related_name='recipient', related_query_name='r')
    sent_at = models.DateTimeField(auto_now_add=True)
    comment = models.TextField()

现在在您views.py使用此查询:

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,))

根据app模型所在的名称额外设置appname

现在您可以按以下方式访问它:

for user in users:
    print user.username
    print user.last_message_time
    print user.message

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在mysql中为每个用户获取最新消息?

猫鼬-查找每个用户的最新消息

从表中查找最新消息,按用户在mysql中分组

如何获得当前用户和其他人之间的最新消息?

Bot API,我如何获取最新消息或聊天记录?

获取每个对话的最新消息

SQL-从每次对话中获取最新消息

如何从mySQL的每次对话中获取最新消息?

如何使用MongoDb在NodeJS中获取收件箱的用户及其最新消息

在Postgresql中获取两个用户之间的对话中的最新消息

仅显示每个对话中的最新消息

获取每次对话中的最新消息

如何从mongodb的聊天对话中获取最新消息

Maria Db-从用户ID =变量的所有消息列表中获取最新消息

聚合查询无法与用户A来回发送最新消息

MYSQL在一条语句中进行多对多选择(聊天,最新消息,用户名)

列出聊天的最新消息

如何获取集合中每个发件人的最新消息?

在irssi中,如何显示当前chan或当前用户的先前聊天记录(如果存在bitble)?

如何在SQL中某个用户的每次会话中获取最新消息?

如何在mongo中执行此查询:获取有关用户列表的最新消息

显示消息表中的最新消息,按用户分组

雷鸟仅转发对话中的最新消息

选择每个线程的最新消息

获取每个对话的最新消息

获取对话中的最新消息

如何请求在房间内显示最新消息

使用 tweepy 获取用户的最新消息

如何获取所有最新消息,但每条用户消息限制为一条