django 检索每次对话的最后一条消息

siv3szwd  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(123)

我的网站上有一个类似聊天的系统。“我想制作一个对话列表,显示与我讨论过的每个用户发送或接收的最后一条消息。就像你在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。
谢谢你的帮忙

r6hnlfcb

r6hnlfcb1#

你可以试试这个:

latest_messages = Message.objects.filter(Q(sender=request.user) | Q(receiver=request.user)).order_by('-date','sender', 'receiver').distinct('sender', 'receiver').first()

字符串
这将首先按日期降序排序,然后按发送者和接收者排序。然后使用first()选择最新消息。
或者,如果它不起作用,那么你可以在order by中跳过发送者和接收者,只使用日期降序来获取最新的消息,无论是发送者还是接收者:

latest_messages = Message.objects.filter(Q(sender=request.user) | Q(receiver=request.user)).order_by('-date').distinct('sender', 'receiver').first()

相关问题