У меня возникли проблемы с правильной сортировкой данных, поступающих из моей базы данных.Проблемы с правильной сортировкой данных модели
Моя настройка: я использую 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)
В моих взглядах файл Джанго 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
.
Спасибо тонну!