[英]How to use order_by with last_added manytomanyfield?
Models.py模型.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)
How to order this queryset PersonalRoom.objects.all()
by the value "message__created_date"
ManyToManyField
last added message_list object, which is last_item = message_list.all().order_by('-message__created_date')[0]
.如何通过值
"message__created_date"
ManyToManyField
last added message_list object 对这个查询集PersonalRoom.objects.all()
进行排序,即last_item = message_list.all().order_by('-message__created_date')[0]
。
My idea is我的想法是
PersonalRoom.objects.all().order_by(
Subquery(
PersonalRoom.objects.get(pk=OuterRef('pk')).message_list.all().order_by('-message__created_date')[0]
)
)
but this results in an error.但这会导致错误。
Try reverse relationship like:尝试反向关系,如:
PersonalRoom.objects.all().order_by('-message_list__message__created_date')
models.py模型.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视图.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
is the reverse sorted PersonalRoom, where all the user related room models are sorted by the last added message with created date. sorted_rooms
是反向排序的 PersonalRoom,其中所有与用户相关的房间模型都按最后添加的带有创建日期的消息进行排序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.