简体   繁体   English

如何将 order_by 与 last_added manytomanyfield 一起使用?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM