Как использовать order_by с last_added manytomanyfield?
Models.py
class ChatRoomId(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
created_date = models.DateTimeField(auto_now_add=True)
class MessageContent(models.Model):
content = models.TextField(blank=True)
created_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now=True)
class PersonalMessage(models.Model):
message = models.ForeignKey(MessageContent, on_delete=models.CASCADE)
sender = models.ForeignKey(CustomUser, on_delete=models.DO_NOTHING)
class PersonalRoom(models.Model):
room_id = models.ForeignKey(ChatRoomId, on_delete=models.CASCADE)
user = models.ManyToManyField(CustomUser)
message_list = models.ManyToManyField(PersonalMessage)
modified_date = models.DateTimeField(auto_now=True)
Как упорядочить этот набор запросов PersonalRoom.objects.all()
по значению "message__created_date"
ManyToManyField
последнего добавленного объекта message_list, который является last_item = message_list.all().order_by('-message__created_date')[0]
.
Моя идея такова
PersonalRoom.objects.all().order_by(
Subquery(
PersonalRoom.objects.get(pk=OuterRef('pk')).message_list.all().order_by('-message__created_date')[0]
)
)
но это приводит к ошибке.
Попробуйте обратные отношения, например:
PersonalRoom.objects.all().order_by('-message_list__message__created_date')
models.py
class PersonalRoom(models.Model):
room_id = models.ForeignKey(ChatRoomId, on_delete=models.CASCADE)
user = models.ManyToManyField(CustomUser)
message_list = models.ManyToManyField(PersonalMessage)
modified_date = models.DateTimeField(auto_now=True)
@property
def last_message_date(self):
_message = self.message_list.all().order_by('-message__created_date')[0]
_date = _message.message.created_date
return _date
views.py
_rooms = PersonalRoom.objects.filter(user__in=[request.user], message_list__isnull=False).distinct()
sorted_rooms = sorted(_rooms, key=lambda item: item.last_message_date, reverse=True)
sorted_rooms
- это PersonalRoom с обратной сортировкой, где все связанные с пользователем модели комнат сортируются по последнему добавленному сообщению с датой создания.