2017-01-07 52 views
4

我正在爲用戶聊天創建一個私人用戶,爲了與某人聊天,所連接的用戶必須輸入用戶的用戶名,並與他想要在他自己的網址上進行交談。如何向用戶對話顯示每個用戶的最後一條消息以保存聊天記錄?

既然這個系統已經建好了,我想保留一個聊天記錄,以便稍後我可以發送聊天通知。爲此,我需要獲取每個對話的最後一條消息,並且我想在連接的用戶自己的聊天檔案中顯示它。

正如下面的圖片:

enter image description here

型號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) 

問:如何才能篩選並訂購我認爲這樣做呢?在額外按名稱

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

設置應用程序的名字:

回答

1

首先,在您的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使用添加相關查詢名稱此查詢其中模型是app

現在,您可以通過以下方式訪問它:

for user in users: 
    print user.username 
    print user.last_message_time 
    print user.message 
0
def inbox(request, username)  
    # first select all the comments related to user 
    user = User.objects.get(username=username) 
    related = userComment.objects.filter(q(client=user) | q(worker=user)).order_by('-sent_at') 

    # This selects the latest comments. 
    # Now loop over the related comments and group them. 
    chats = {} 
    for comment in related: 
     if comment.client == user: 
      previous_chat_history = chats.setdefault(comment.worker.username, []) 
      if not len(previous_chat_history) >= 3: 
       previous_chat_history.append(comment) 
     if comment.worker== user: 
      previous_chat_history = chats.setdefault(comment.client.username, []) 
      if not len(previous_chat_history) >= 3: 
       previous_chat_history.append(comment) 

    # Reverse each list to keep the latest message last 
    for k, v in chats.items(): 
     chats[k] = v.reverse() 

    return render(request, 'template.html', context={chats: chats}) 
+0

不行的,這隻能得到所有查詢的最後一個項目。我希望它得到每個不同的消息集的最後一個項目,再加上如果它是由日期時間排序,然後有一個巨大的問題是,你可以在一個錯誤的收件箱中收到來自其他用戶的消息。 – Lindow

+0

@KasimovNuriddin請張貼UserComment在模型 – eskawl

+0

我已經張貼模型 – Lindow

0

[更新]:我剛剛意識到,因爲它是在distinct使用的字段名該解決方案將只可和PostgreSQL合作。


你可以混合order_bydistinct,以達到預期的效果:

  1. 過濾用戶所在要麼client的評論或worker

    comments = userComment.objects.filter(Q(client=request.user) | Q(worker=request.user)) 
    
  2. 順序用戶評論clientworkersent_at字段。確保有sent_at場從高到低的順序,從而爲每一個客戶,員工對最新的評論是在頂部:

    comments = comments.order_by('client', 'worker', '-sent_at') 
    
  3. 現在,得到了不同行:

    comments = comments.distinct('client', 'worker') 
    

    這將只保留第一行是每個客戶機 - 工作對的最新評論,並刪除查詢集中的其餘行。


在一個聲明:

comments = userComment.objects \ 
       .filter(Q(client=request.user) | Q(worker=request.user)) \ 
       .order_by('client', 'worker', '-sent_at') \ 
       .distinct('client', 'worker') 

這會給你的每個對話中的最新評論,其中用戶可以是一個clientworker

相關問題