如何在不重复发送和接收邮件的情况下筛选用户?

时间:2018-08-31 14:57:29

标签: django django-models django-views django-filter

我想在用户之间创建一个简单的聊天应用程序。这是代码的一部分:

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中获得了聊天列表,但对于每条消息,相同的用户都会出现在列表中。如何仅在我发送和接收邮件后才过滤用户。另外,如果可以创建唯一的聊天室,那么任何建议都会有用。

2 个答案:

答案 0 :(得分:0)

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

选项2:如果您试图创建结合两个模型的数据集,并且需要更多控制,为什么不根据需要创建列表/列表并在模板中进行渲染。

答案 1 :(得分:0)

这里有一个基本的替代解决方案,我为用户创建了一个列表,使用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>