#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
уже использую, и это будет сортироваться на уровне базы данных. Отлично подходит для решения этой проблемы.