我有一个模型Conversation
和一个模型Message
。
模型Message
具有会话的外键,文本字段和日期字段。
如何列出所有会话,并为每个会话获取最新消息和最新消息的日期?
我想这就像是
Conversation.objects.annotate(last_message=Max('messages__date'))
但它只会给我最新的约会。我希望last_message
包含最后一条消息的文本及其创建日期。也许我需要使用prefetch_related?
答案 0 :(得分:4)
从Django 1.11开始,您可以使用Subqueries expressions:
latest_message = Subquery(Message.objects.filter(
conversation_id=OuterRef("id"),
).order_by("-date").values('value')[:1])
conversations = Conversation.objects.annotate(
latest_message=latest_message,
)
答案 1 :(得分:-2)
您可以使用prefetch_related
和queryset
来完成此操作。类似的东西:
Conversation.objects.prefetch_related(Prefetch('messages'),
queryset=Message.objects.order_by('date')[0])