我无法正确地对来自数据库的数据进行排序。
我的设置:我广泛地使用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"))
,因为如果phone_number
记录分散在各处,groupby()
就不会工作。不幸的是,正是这个data.sort()
改变了排序,我完全失去了原来的order_by("date_time")
排序。
我试过很多东西。在最初调用之前和之后,我都尝试过调用data.sort(key=itemgger("date_time")
。如果我之前调用它,它是无效的;如果我在之后调用它,我会丢失phone_number
排序。我尝试将date_time
作为第二个参数传递给data.sort()
,它不起作用。我尝试了其他我现在甚至不记得的事情--它们都没有产生任何结果。
我已经在这上面工作了1.5天了,我被卡住了。我会感谢任何想法,包括如何更好地分组我的数据,以及如何让分组和date_time
排序正确完成。
非常感谢!
发布于 2017-01-09 02:23:27
我真的需要建立一个宗教或者别的什么。每次我在SO上发布一个问题,我都能在30分钟内自己回答。
这是我所做的:
QuerySet现在看起来像这样:
queryset = self.filter_queryset(self.get_queryset()).order_by("phone_number_clean", "date_time")
我在groupby()
循环中添加了另一个conversation_dict
参数:
conversation_dict["last_date"] = messages[-1]["date_time"]
本质上,它只是获取该会话的最后一条消息的日期。
在groupby
循环之后,我简单地执行以下操作:
conversation_list.sort(key=itemgetter("last_date"))
我得到了我想要的结果。瞧!
https://stackoverflow.com/questions/41540033
复制