我有一个Message
课程,其中包含fromUser
,toUser
,text
和createdAt
字段。
我想模仿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')
等等,但是让我不要用明显无意义的代码片段模糊真实主题。我怎样才能达到这个基本或更好的说法,一般众所周知的结果?
答案 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')