如何在 Django 中创建对话收件箱

2024-01-31

我有一个Message类有fromUser, toUser, text and createdAt fields.

我想模仿 Whatsapp 或 iMessage 或任何 SMS 收件箱,这意味着我想获取每个对话的最后一条消息。

I tried:

messages = Message.objects.order_by('createdAt').distinct('fromUser', 'toUser')

但这不起作用,因为SELECT DISTINCT ON expressions must match initial ORDER BY expressions error.

我不太明白这是什么意思,我也尝试过:

messages = Message.objects.order_by('fromUser','toUser','createdAt').distinct('fromUser', 'toUser')

等等,但让我不要用明显毫无意义的代码片段来模糊这里的真正主题。我怎样才能实现这个基本的或者更好的说法,众所周知的结果?


你的第二种方法是正确的。来自 Django 文档 https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct:

当您指定字段名称时,必须在 QuerySet 中提供 order_by(),并且 order_by() 中的字段必须以 unique() 中的字段开头,顺序相同。

例如,SELECT DISTINCT ON (a) 为您提供 a 列中每个值的第一行。如果您不指定顺序,您将得到一些任意行。

这意味着您必须在 order_by() 方法中包含与要在 unique() 方法中使用的相同的列。事实上,您的第二个查询正确地包含 order_by() 方法中的列:

messages = Message.objects.order_by('fromUser','toUser','createdAt').distinct('fromUser', 'toUser')

为了获取最新记录,您需要按降序对createdAt列进行排序。指定此顺序的方法是在 order_by() 方法中的列名称上包含减号(这里的文档中有一个这样的例子 https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by)。这是您应该使用的最终表单,以按最新到先的顺序获取消息列表:

messages = Message.objects.order_by('fromUser','toUser','-createdAt').distinct('fromUser', 'toUser')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Django 中创建对话收件箱 的相关文章

随机推荐