如何使用外键按字段排序

How to sort by field using ForeignKey

我有一个房间模型中所有对象的查询集。 qs = Rooms.objects.all() 我需要根据 Message table 中最后收到的消息对其进行排序。我有一个可变房间,它与 Room 有 FK 关系。 IE。最后创建的 Message 对象,应该充当 1 Room,倒数第二个应该放在第二个,等等。 我如何在 Room 中参考时间戳进行排序? qs.order_by("message_room__timestamp") 我尝试做 qs.order_by("message_room__timestamp"),但出于某种原因,我得到了一个非常奇怪的响应,我得到了重复的房间

class Room(models.Model):
    name = models.CharField(max_length=255, unique=True)


class Message(models.Model):
    room = models.ForeignKey(Room, on_delete=models.CASCADE, default=None, null=True, related_name="message_room")
    text = models.CharField(max_length=255)
    timestamp = models.DateTimeField(auto_now_add=True)

发生这种情况的原因是因为它会在 Message 上生成 LEFT OUTER JOIN,因此对于每个 Message、return 和 Room 一次,因此同一个房间可以出现多次。

您可以使用最大的时间戳进行注释,因此:

from django.db.models import Max

Room.objects.alias(
    <strong>latest_message=Max('message_room__timestamp')</strong>
).order_by(<strong>'latest_message'</strong>)