在Django中使用最新的相关对象进行批注

时间:2015-05-29 11:19:51

标签: python django django-models django-queryset

我有一个模型Conversation和一个模型Message

模型Message具有会话的外键,文本字段和日期字段。

如何列出所有会话,并为每个会话获取最新消息和最新消息的日期?

我想这就像是

Conversation.objects.annotate(last_message=Max('messages__date'))

但它只会给我最新的约会。我希望last_message包含最后一条消息的文本及其创建日期。也许我需要使用prefetch_related?

2 个答案:

答案 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_relatedqueryset来完成此操作。类似的东西:

Conversation.objects.prefetch_related(Prefetch('messages'),
             queryset=Message.objects.order_by('date')[0])