Python Django:注释最新外键的两个值

Python Django:注释最新外键的两个值,python,django,python-3.x,datetime,Python,Django,Python 3.x,Datetime,我实际上使用的是python 3.7和Django 3.0.4 我在我的应用程序中使用models.py作为一个简单的消息系统 从torii.models导入用户 教室(模型.模型): 用户=模型.ManyToManyField(用户, 相关_name='rooms', 空白=真) name=models.CharField(最大长度=100) 类消息(models.Model): 房间=模型。外键(房间, 在_delete=models.CASCADE上, 相关_name='messages'

我实际上使用的是python 3.7和Django 3.0.4

我在我的应用程序中使用models.py作为一个简单的消息系统

从torii.models导入用户
教室(模型.模型):
用户=模型.ManyToManyField(用户,
相关_name='rooms',
空白=真)
name=models.CharField(最大长度=100)
类消息(models.Model):
房间=模型。外键(房间,
在_delete=models.CASCADE上,
相关_name='messages')
user=models.ForeignKey(用户,
on_delete=models.CASCADE)
content=models.TextField()
日期=型号。日期时间字段(自动\u现在\u添加=真)
因此,当我的用户发送消息时,我会创建一个新的
消息
对象,该对象附加到我的
房间
。 我想查询给定
用户的所有
房间
,并在查询中注释最近一条消息的日期最后一条消息的日期

使用
Max
获取我的相关消息中的最新日期没有问题,如下所示:

用于room.objects.filter(users=user)中的文件室。注释(last_message_date=Max('messages_date'))。订购人('-last_message_date'):
打印(文件室)
{'id':7,'name':'room-7','last_message_date':datetime.datetime(2020,3,20,14,0,2118190,tzinfo=)}
{'id':9,'name':'room-9','last_message_date':datetime.datetime(2020,3,8,15,19,52,343780,tzinfo=)}
{'id':8,'name':'room-8','last_message_date':datetime.datetime(2020,3,7,17,18,32,648093,tzinfo=)}
但是我找不到任何方法来简单地注释最后一条消息的
内容。我试过
Max('messages\uu content')
,但事实上,它是按字母顺序排列消息的,返回的消息总是一样的。。。我用
F
Q
尝试了几个子查询,但效果不是很好


如何使用我的查询直接注释
room.messages.last().content
的结果

最后,我使用
OuterRef
Subquery
解决了这个问题

从django.db.models导入Max、OuterRef、子查询
最新=Message.objects.filter(room_id=OuterRef('pk')).order_by('-date'))
用于room.objects.filter(用户=用户)中的文件室
.annotate(最后一条消息的日期=最大值(“消息的日期”),
最后一条消息=子查询(最新的.values('content')[:1]))
.order_by('-最后一封邮件日期'):
打印(r.u_udict_u_u)
据我所知,我们预先准备了
子查询
,方法是使用调用子查询的元素的
id
,对过滤后的元素进行
注释,然后按
-date
排序。因此,它返回最新的元素,我们使用字段
content
值对其进行注释


这将使用数据库的所有性能创建一个复杂但唯一的请求。

为什么要获取一个大查询而不是使用3个查询(例如),我认为有几种方法可以实现。通过使用所有这些性能,我只尝试单次访问我的数据库,而不是实现几个不能并发的simples请求