我的网站上有一个类似聊天的系统。“我想制作一个对话列表,显示与我讨论过的每个用户发送或接收的最后一条消息。就像你在whatsapp、信使或短信应用程序上看到的一样。
我的消息模型目前如下所示:
class Message(models.Model):
sender = models.ForeignKey('accounts.User', on_delete=models.CASCADE, related_name='messages_sent')
receiver = models.ForeignKey('accounts.User', on_delete=models.CASCADE, related_name='messages_received')
content = models.TextField()
date = models.DateTimeField(auto_now_add=True)
seen = models.BooleanField(default=False)
字符串
我尝试了一些事情,我最接近的是:
latest_messages = Message.objects.filter(Q(sender=request.user) | Q(receiver=request.user)).order_by('sender', 'receiver', '-date').distinct('sender', 'receiver')
型
问题是,它返回每个用户发送的最后一条消息和接收的最后一条消息,而我希望这2条消息中的最后一条。
这里是一个例子,假设我有4个用户发送消息,我的消息表看起来像这样:
的数据
如果我是id为1的用户,则请求应该返回me 2消息示例。
ID为330的消息(与user_id 7交换的最后一条消息)和ID为321的消息(与user_id 2交换的最后一条消息)
如果我是user_id 7,我将得到message_id 330和327,如果我是user 2,我将得到message_id 327和321。
谢谢你的帮忙
1条答案
按热度按时间r6hnlfcb1#
你可以试试这个:
字符串
这将首先按日期降序排序,然后按发送者和接收者排序。然后使用
first()
选择最新消息。或者,如果它不起作用,那么你可以在
order by
中跳过发送者和接收者,只使用日期降序来获取最新的消息,无论是发送者还是接收者:型