user9127407
user9127407

Reputation:

Distinct Users Filtering

I'm trying to create a messaging App in django but I couldn't re-order the Users properly

Here's the Models,

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)

Here's the View,

def message(request):
    users = Message.objects.filter(Q(sender=request.user) | Q(receiver=request.user)).values('sender__first_name', 'receiver__first_name', 'receiver__id', 'sender__id').annotate(Max('id')).order_by('-id__max')
    return render(request, 'chat/users.html', {'users': users})

Here's what I tried in Template,

{% for user in users %}
    {% if user.sender__id != request.user.id %}
        {{ user.sender__first_name }}
    {% else %}
        {{ user.receiver__first_name }}
    {% endif %}
{% endfor %}

This code seems working fine but it's returning same user "Twice" as long as request.user send someone a message & that person replies back to it.

How can I fix this problem? Thank You . . .

Upvotes: 0

Views: 48

Answers (1)

akimul
akimul

Reputation: 329

Use the following query:

def message(request):
    users = Message.objects.filter(Q(sender=request.user) | Q(receiver=request.user)).values('sender__first_name', 'receiver__first_name', 'receiver__id', 'sender__id').annotate(Max('id', distinct = True)).order_by('-id__max')
return render(request, 'chat/users.html', {'users': users})

Hope it will work.

Upvotes: 1

Related Questions