2017-01-09 2 views
0

У меня возникли проблемы с правильной сортировкой данных, поступающих из моей базы данных.Проблемы с правильной сортировкой данных модели

Моя настройка: я использую 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.

Спасибо тонну!

ответ

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

И я получаю результаты, которые я хотел. Voila!

 Смежные вопросы

  • Нет связанных вопросов^_^