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

时间:2014-10-29 20:38:07

标签: django django-queryset

我有一个Message课程,其中包含fromUsertoUsertextcreatedAt字段。

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

我试过了:

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

但由于SELECT DISTINCT ON expressions must match initial ORDER BY expressions错误,这不起作用。

我真的不明白这意味着什么,我也尝试过:

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

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

1 个答案:

答案 0 :(得分:2)

你的第二种方法是正确的。 From the Django docs

  

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

     

例如,SELECT DISTINCT ON(a)为您提供a列中每个值的第一行。如果您没有指定订单,您将获得一些任意行。

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

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

要获取最新记录,您需要按降序排序createdAt列。指定此顺序的方法是在order_by()方法(there is an example of this in the docs here)中的列名称上包含减号。以下是您应该使用的最终表单,以最新的顺序获取您的邮件列表:

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