我有Message
型号:
class Message(models.Model):
message_from = models.ForeignKey(User, related_name="%(class)s_message_form")
message_to = models.ForeignKey(User, related_name="%(class)s_message_to")
message = models.TextField()
files = models.ForeignKey(File, null=True, blank=True)
read = models.BooleanField(default=False)
以及相关的观点:
def view_messages(request):
messages = Message.objects.filter(message_to=request.user)
return render(request, 'templates/messages.html', {'messages': messages})
假设多个用户多次向接收者发送消息,并且此查询返回多个对象。我想为每个发件人返回一个对象,以便我可以创建指向单个用户的邮件的链接。我是否将某些内容传递给message_from
参数以确保每个用户可以返回一个对象?
答案 0 :(得分:0)
您实际上可以从邮件中提取message_from
并返回邮件,而不是返回messages
。
messages = Message.objects.filter(message_to=request.user)
sender_ids = messages.values_list('message_from', flat=True).distinct()
senders = User.objects.filter(id__in=sender_ids)
return render(request, 'templates/messages.html', {'senders': senders})
然后在messages.html
(我认为最好将其称为senders.html
,因为您想要点击每个发件人并检查他们发送的邮件),您列出了发送邮件的所有发件人对于当前用户,然后使其可单击并重定向到该发件人已发送给当前用户的邮件列表。
答案 1 :(得分:0)
如果您使用PostgreSQL作为RDBMS,则可以使用.disting(*fields)
方法。
您的查询将是这样的 -
messages = Message.objects.filter(message_to=request.user).distinct('message_from')
此方法仅由PostgreSQL支持(检查django文档)。通过这种方式,您可以轻松检索未读消息或最后消息。
但是如果你想要检索用户:
users = User.objects.filter(message_set__message_from=request.user).distinct()
此方法将执行连接,与@ shang-wang建议的响应子查询相对。