正确排序模型数据的问题

时间:2017-01-09 02:09:29

标签: python mysql django django-models django-rest-framework

我无法正确排序来自我的数据库的数据。

我的设置:我广泛使用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排序。

非常感谢!

1 个答案:

答案 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"))

我得到了我想要的结果。 瞧!