dosya97
@dosya97
Fullstack web-developer

Как упростить запрос на получение последних чатов?

Привет Всем! Смотрю на свой старый метод retrieve-a последних чатов с пользователями. Это полный трэш, так как производится несколько запросов к базе, еще и два цикла.
chatters = []
for message in Message.objects.filter(Q(user_from=user)|Q(user_to=user))\
        .order_by("created"):
    chatters.append(message.user_from)
    chatters.append(message.user_to)
counter = Counter(chain(chatters))
ordered = sorted(
                      set(chatters).union(chatters), 
                      key=lambda k: counter[k], 
                      reverse=True)
chatters=[]
for chatter in ordered:
    chatters.append(
        Message.objects.filter(
             Q(user_from=chatter,user_to=user)|Q(user_from=user,user_to=chatter))\
             .order_by("-created")[0])
chats = sorted(set(chatters),key=lambda k: k.created,reverse=True)

Как сделать это проще, да так, чтобы можно было передать к queryset Rest и добавить дополнительные поля. Метод работает, но я понимаю, что это слишком нагруженная процедура с лишними движениями. Думаю нужно использовать возможности БД и ORM(типа distinct() итд.)
Помогите, пожалуйста!
Вот вариант по-короче:
chats = []
messages = Message.objects.filter(Q(user_from=user)|Q(user_to=user)).order_by("created")
chatters = set(messages.values_list('user_from', flat=True)).union(messages.values_list('user_to', flat=True))
for chatter in list(chain(chatters)):
	filtered = messages.filter(Q(user_from__id=chatter,user_to=user)|Q(user_from=user,user_to__id=chatter)).order_by("-created")
    if len(filtered)>0:
    	chats.append(filtered[0])
  • Вопрос задан
  • 374 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы