过滤具有多个ManyToMany结果的对象

时间:2015-12-04 14:00:40

标签: python django

我有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参数以确保每个用户可以返回一个对象?

2 个答案:

答案 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建议的响应子查询相对。