繁体   English   中英

筛选具有多个ManyToMany结果的对象

[英]Filter objects with multiple ManyToMany results

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

实际上,您可以从消息中提取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因为您要单击每个发件人并检查其发送的邮件),列出了所有向当前用户发送邮件的发件人,然后使其可单击并重定向到该发件人已发送给当前用户的邮件列表。

如果将PostgreSQL用作RDBMS,则可以使用.disting(*fields)方法。

您的查询将是这样的-

messages = Message.objects.filter(message_to=request.user).distinct('message_from')

PostgreSQL仅支持此方法(请参阅django docs)。 这样,您可以轻松地检索未读消息或最新消息。

但是,如果要检索用户:

users = User.objects.filter(message_set__message_from=request.user).distinct()

该方法将执行联接,与@ shang-wang建议的响应的子查询相反。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM