У меня есть набор запросов всех объектов в модели комнаты. qs = Комнаты.объекты.все() Мне нужно отсортировать его по последнему полученному сообщению в таблице сообщений. Там у меня есть переменная комната, которая имеет отношение FK к комнате. т.е. последний созданный объект Message должен действовать как 1 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)
Причина, по которой это происходит, заключается в том, что он создаст LEFT OUTER JOIN
на Message
и, таким образом, для каждого Message
вернет Room
один раз, и, таким образом, одна и та же комната может появиться несколько раз.
Вы можете аннотировать самую большую отметку времени, поэтому:
from django.db.models import Max
Room.objects.alias(
latest_message=Max('message_room__timestamp')
).order_by('latest_message')