Здесь вам не требуется метод Земле (), вам нужно агрегация . Этот запрос будет делать то, что вы хотите:
from django.db.models import Max
Topic.objects.annotate(Max('message__pub_date')).order_by('-message__pub_date__max')
Хотя, если это рабочий код, вы, вероятно, захотите последовать совету akaihola и денормализировать «last_message_posted» непосредственно в модель Topic.
Также в вашем значении по умолчанию для Message.pub_date есть ошибка. Теперь, когда вы впервые запускаете сервер и загружаете этот код, datetime.now () будет выполняться один раз, и это значение будет использоваться как pub_date для всех сообщений. Используйте это вместо того, чтобы передать сам вызываемый объект, чтобы он не вызывался до тех пор, пока не будет создано каждое сообщение:
pub_date = models.DateTimeField(default=datetime.now)