如何在不重复发送和接收消息的情况下过滤用户?

How to filter user without duplication that i have sent and received messages?

我想在 users.Here 之间创建简单的聊天应用程序是代码的一部分:

Models.py:

class Chat(models.Model):
    message   = models.CharField(max_length=250)
    sender    = models.ForeignKey(User,related_name="sent",on_delete=models.CASCADE)
    receiver  = models.ForeignKey(User,related_name="received",on_delete=models.CASCADE)
    timeStamp = models.DateTimeField(auto_now_add=True)
    read      = models.BooleanField(default=False)

Views.py:

def inbox(request):

    sent_list     = Chat.objects.filter(sender=request.user)
    received_list = Chat.objects.filter(receiver=request.user)
    inbox_list    = sent_list | received_list

    context={
    'inbox_list':inbox_list
    }

    return render(request,'blog/inbox.html',context)

Inbox.html:

{%for message in inbox_list %}
    {% if message.sender == request.user %}
      <a href="{% url 'chat' message.receiver.id %}" >{{message.receiver.username}}</a>
    {%else%}
      <a href="{% url 'chat' message.sender.id %}" >{{message.sender.username}}</a>
    {% endif%}
{% endfor%}

我在 Inbox.html 中获取了聊天者列表,但对于每条消息,列表中都出现了相同的用户。如何仅在我发送和接收消息后过滤用户。另外,如果可以创建独特的聊天室,任何建议都会有用。

选项 1:尝试使用 distinct() Django doc

选项 2:如果您尝试创建结合两个模型的数据集并且需要更多控制,为什么不根据需要创建 list/list-of-list 并在模板中呈现相同的内容。

这里我有一个基本的替代解决方案,我为用户创建了一个列表,用 for 循环迭代所有消息,并为每条消息添加了带有 if 条件的消息发送者和接收者以防止重复。

Views.py:

def inbox(request):


sent=Chat.objects.filter(sender=request.user).distinct('receiver')
received=Chat.objects.filter(receiver=request.user).distinct('sender')
all= list(chain(sent, received))
users = []

for m in all:
    if not m.sender in users and not m.sender == request.user:
        users.append(m.sender)
    if not m.receiver in users and not m.receiver == request.user:
        users.append(m.receiver)

context={'users':users,}

return render(request,'blog/inbox.html',context)

Inbox.html:

<div class="container">
 {%for user in users %}
  <div>
   <img style="width:50px;height:50px;"class="profile-photo" src="    
    {{user.profile.image.url}}"/>
   <a href="{% url 'chat' user.username %}" >{{user.username}}</a>
  </div></br>
 {% endfor%}
</div>