如何使用外键按字段排序
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>)
我有一个房间模型中所有对象的查询集。 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>)