gpt4 book ai didi

python - 如何显示每个用户对用户对话的最后一条消息以保留聊天记录?

转载 作者:太空宇宙 更新时间:2023-11-03 11:45:13 24 4
gpt4 key购买 nike

我正在为用户聊天创建一个私有(private)用户,为了与某人聊天,连接的用户必须在他自己的 url 上输入他想与之交谈的用户的用户名。

既然这个系统已经搭建好了,我想保留一个聊天记录,以便以后发送聊天通知。为此,我需要获取每个对话的最后一条消息,并且我想在连接的用户自己的聊天配置文件中显示它。

如下图:

enter image description here

模型 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')

模型.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)

问题:如何过滤和排序我的 View ?

最佳答案

首先在你的 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名称设置extra中的appname。

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

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

关于python - 如何显示每个用户对用户对话的最后一条消息以保留聊天记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41526911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com