Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 过滤具有多个多个结果的对象_Python_Django - Fatal编程技术网

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

Python 过滤具有多个多个结果的对象,python,django,Python,Django,我有一条消息型号: 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

我有一条
消息
型号:

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\u传递了一些信息以确保每个用户可以返回一个对象?

您实际上可以从
消息中提取
message\u并返回它们,而不是返回
消息

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\u-to=request.user)。distinct('Message\u-from')

只有PostgreSQL(检查django文档)支持此方法。通过这种方式,您可以轻松检索未读邮件或最后的邮件

但如果要检索用户,请执行以下操作:

users=User.objects.filter(message\u set\u message\u from=request.User).distinct()


此方法将执行一个连接,与@shang wang建议的响应的子查询相对。

这很有效,因为我正在使用PostgreSQL。是否可以选择显示的最后一条记录,即用户最近的记录?当然,只需按日期降序即可。但您必须在distinct子句中包含日期字段。我有
messages=Message.objects.filter(Message\u-to=request.user)。distinct('Message\u-from','time\u-date')。order\u-by('-time\u-date')
,但这将返回来自同一用户的两条不同消息。我应该分别给distinct打两次电话吗?哦,对不起,我的错。不要在distinct子句中包含
time\u date
。这会在我将其从distinct子句中取出时导致
编程错误。