我无法正确排序来自我的数据库的数据。
我的设置:我广泛使用Django + Django Rest Framework,VueJS作为前端。我有一个数据库表,其中包含对用户ForeignKey
引用的消息。这些消息来自不同的联系人(电话号码),我希望能够将它们分组到对话中。这样,在前端,我将能够看到一个包含phone_number
所有邮件的对话框,另一个与另一个phone_number
等单独对话。
我想要它安排的方式是我希望最新的对话框出现在左上角,最近的第二个对话框,然后继续使用最右边最近的对话框。
这是Django模型:
class Message(models.Model):
phone_number = models.CharField(max_length=100, blank=True)
phone_number_clean = models.CharField(max_length=100, blank=True)
contact_name = models.CharField(max_length=255, blank=True)
date_time = models.DateTimeField(null=True)
body = models.TextField(blank=True)
user = models.ForeignKey(User)
在我的Django Rest Framework视图文件中,我像这样覆盖了list()
方法:
queryset = self.filter_queryset(self.get_queryset()).order_by("date_time") # get the data ordered by date_time
serializer = self.get_serializer(queryset, many=True)
data = serializer.data
data.sort(key=itemgetter("phone_number"))
conversation_list = []
for key, group in itertools.groupby(data, lambda item: item["phone_number"]):
conversation_dict = {}
messages = [item for item in group][-50:] # Get only the last 50 messages per phone_number
conversation_dict["messages"] = messages # A list of all the messages
conversation_dict["conversation_key"] = key
conversation_list.append(conversation_dict)
return Response(conversation_list)
我正在使用itertools.groupby()
来按phone_number
对我的邮件进行分组。出于这个原因,我的理解是我必须使用data.sort(key=itemgetter("phone_number"))
因为如果groupby()
记录遍布整个地方,phone_number
不起作用。不幸的是,data.sort()
改变了排序,我完全丢失了原来的order_by("date_time")
排序。
我尝试了很多东西。我在原始呼叫之前和之后尝试呼叫data.sort(key=itemgger("date_time")
。如果我之前打电话,它没有效果;如果我之后再打电话,我会失去phone_number
种。我尝试将date_time
作为第二个参数传递给data.sort()
,但它没有用。我尝试了其他我现在甚至不记得的事情 - 它们都没有产生任何结果。
我已经为此工作了1.5天,而且我已经陷入困境。非常感谢任何想法,包括如何更好地分组我的数据以及如何正确地完成分组和date_time
排序。
非常感谢!
答案 0 :(得分:0)
我真的需要开始一种宗教信仰。每当我在SO上发布问题时,我都可以在30分钟内自己回答。
这就是我所做的:
QuerySet现在看起来像这样:
queryset = self.filter_queryset(self.get_queryset()).order_by("phone_number_clean", "date_time")
我在conversation_dict
循环中添加了另一个groupby()
参数:
conversation_dict["last_date"] = messages[-1]["date_time"]
基本上它只是抓取该对话的最后一条消息的日期。
在groupby
循环后,我只是这样做:
conversation_list.sort(key=itemgetter("last_date"))
我得到了我想要的结果。 瞧!