如何在不重复发送和接收消息的情况下过滤用户?
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>
我想在 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>