2017-10-30 1 views
0

は、ここで私はrequest.userまたはrequest.userが、最近メッセージを送った人にメッセージを送信者に基づいてユーザーを注文したい私のモデル、ジャンゴ:メッセージアプリケーション

class Message(models.Model): 
    sender = models.ForeignKey(User, related_name="sender") 
    receiver = models.ForeignKey(User, related_name="receiver") 
    msg_content = models.TextField() 
    created_at = models.DateTimeField(auto_now_add=True) 

です!ソーシャルネットワーク上で見ているように。 request.userが誰かにメッセージを送信した場合にのみこれは私が試したものです

users = User.objects.filter(Q(sender__receiver=request.user) | Q(receiver__sender=request.user)).annotate(Max('receiver')).order_by('-receiver__max') 

このコードは正常に動作しています。 request.userにメッセージを送信した場合のメッセージの順序は変更されません。

また、私は明確なユーザーを除外するcould't、

users = Message.objects.filter(sender=request.user, receiver=request.user).order_by("created_at") 

を試してみました。しかし。メッセージと同じ数のユーザーを表示しています。

この問題を解決するにはどうすればよいですか?ありがとうございました!

+0

2番目のクエリでは、基本的に、同じ認証済みユーザーから認証されたユーザーに送信されるメッセージを探していませんか? –

答えて

0

認証されたユーザーの会話を見つけようとしているときに同じ問題が発生しました。

def is_message_in_list(self, conversations, message): 
    for msg in conversations: 
     if (msg.sender == message.sender and msg.receiver == message.receiver) or \ 
      (msg.sender == message.receiver and msg.receiver == message.sender): 
      return True 

    return False 

def get(self, request): 
    user = request.user 
    messages = Message.objects.filter(
     Q(sender=user) | Q(receiver=user) 
    ).order_by('-created_at').select_related('sender', 'receiver') 

    conversations = [] 
    for message in messages: 
     if not self.is_message_in_list(conversations, message): 
      conversations.append(message)