我正在创建一个私人用户进行用户聊天,为了与某人聊天,已连接用户必须在自己的URL上输入要与之对话的用户的用户名。
现在已经建立了该系统,我想保留聊天记录,以便以后可以发送聊天通知。为此,我需要获取每个对话的最后一条消息,并将其显示在连接的用户自己的聊天个人资料上。
如下图所示:
型号 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)
问题:如何过滤和排序视图?
首先,在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] 删除。
我来说两句