Если вы хотите получить доступ к экземпляру модели, а не только к внешним ключам, вы можете сделать что-то вроде:
from django.db.models import Max
# get the latest id for each user_id (most recent)
latest = Message.objects.values('user_id').annotate(id=Max('id'))
Message.objects.filter(id__in=[m['id'] for m in latest])
Это не так хорошо, как необработанный sql-эквивалент, поскольку возвращается выбор, а затем он используется в качестве основы для фильтра IN (). Это довольно медленно. Альтернативой является написание сырого SQL, и вам следует избегать этого.
-- here it is anyway
SELECT m.id, m.user_id, m.message
FROM Messages m
JOIN (
SELECT user_id, max(id) as max_id
FROM Messages
GROUP BY user_id
) mm
ON m.id = mm.max_id