Ошибка атрибута: объект ‘list’ не имеет атрибута ‘order_by’

#python #django #django-rest-framework

#python #django #django-rest-framework

Вопрос:

Я пытался объединить два queryset объекта с помощью itertools chain функции предопределения python и отфильтровать это с order_by помощью. но я получаю AttributeError : 'list' object has no attribute 'order_by' .
Если бы кто-нибудь мог понять, где я что-то делаю неправильно, то был бы очень признателен. заранее большое вам спасибо.

views.py :

 try:
    qs = Conversation.objects.filter(
        Q(chat__from_user=user) amp;
        Q(chat__to_user=to_user))

    qs_2 = Conversation.objects.filter(
        Q(chat__from_user=to_user) amp;
        Q(chat__to_user=user))
except:
    raise ValidationError({"message":"bad request"})

all_qs = list(chain(qs, qs_2)).order_by('-created_on')

 

Комментарии:

1. вы прочитали текст ошибки? также вы можете объединить условия фильтрации в один запрос с помощью или

Ответ №1:

Вы не можете .order_by(…) создать список. Но на самом деле вам это все равно не нужно. Вы можете просто «объединить» два набора запросов и работать с:

 from django.db.models import Q

all_qs = Conversation.objects.filter(
        Q(chat__from_user=user, chat__to_user=to_user) |
        Q(chat__from_user=to_user, chat__to_user=user)
).order_by('-created_on') 

Как правило, лучше избегать списков, насколько это возможно, поскольку даже если вам удастся отсортировать их на уровне Django / Python, это часто менее эффективно, чем на уровне базы данных, которая представляет собой систему, предназначенную для эффективного выполнения этих задач.

Комментарии:

1. Что вы имеете в виду, делая это на уровне базы данных? Разве этот фильтр не перенаправляет его в базу данных? Если нет, то где бы вы это сделали?

2. @BenjaminK: это так. Комментарий касается того, чтобы избежать вызова list(...) набора запросов и не работать с filter(..) , sorted(..) , поскольку тогда это выполняется на уровне Django / Python, а не в базе данных.

3. Спасибо за ваш ответ. Где они должны быть отсортированы тогда? (Какой файл (все еще views.py ), какой метод?)

4. @BenjaminK: в базе данных, так что с .order_by('-created_on') , поскольку будет помещен в SQL-запрос.

5. Удивительно, спасибо за дальнейшее изложение вашего ответа. Теперь я понял 🙂 итак, все в моем коде правильно, поскольку я order_by уже использую, и это будет сортироваться на уровне базы данных. Отлично подходит для решения этой проблемы.