使用Django的ORM查找每个消息线程中的最新消息

时间:2013-09-19 16:10:32

标签: django postgresql orm

我有一个类似于Facebook的消息传递功能,因为每个人都可以向另一个人发送消息,创建一个新的消息线程,并且这两个人之间的每个后续消息都将出现在同一个线程中。我创建了一个'messages'数据表,它存储了所有消息以及thread_id,它看起来像这样:

id    message    sender_id    receiver_id    thread_id    message_date
1     Hello Bob  3            5              1            ...
2     Hello Jon  5            3              1            ...
3     Hi Jane    2            4              2            ...
4     Hi Sara    4            2              2            ...

我想使用Django的ORM只返回每个唯一thread_id的最新消息。我如何在Django中这样做?

2 个答案:

答案 0 :(得分:1)

如果您使用的是Postgres,您可以执行Message.objects.order_by('thread_id').distinct('thread_id')其他任何事情,您可以这样做:

#first, grab all Threads
threads = Thread.objects.all().prefetch_related('message_set')

# loop through the threads, and get the latest message
for thread in threads:
    latest_message = thread.message_set.latest('message_date')

答案 1 :(得分:0)

类似的东西:

from django.db.models import Max
from myapp.models import Message
Message.objects.annotate(message_date=Max('message_date')).values('id__max')