Как отфильтровать пользователя без дублирования, которое я отправлял и получал сообщения? - PullRequest
0 голосов
/ 31 августа 2018

Я хочу создать простое приложение для чата между пользователями. Вот часть кода:

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 голосов
/ 06 октября 2018

Здесь у меня есть базовое альтернативное решение, я создал список для пользователей, повторил все сообщения с циклом 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>
0 голосов
/ 31 августа 2018

Вариант 1: попробуйте использовать Different () Django doc

Вариант 2: Если вы пытаетесь создать наборы данных, объединяющие две модели, и если вам нужен больший контроль, почему бы не создать список / список-список, как вам нужно, и отобразить его в шаблоне.

...