Как выполнить сортировку с помощью attrgetter из общего атрибута внешнего ключа
doc_skai = DocSKAI.objects.all()
doc_added = DocAddedSKAI.objects.all()
result_list = sorted(chain(doc_skai, doc_added),key=attrgetter('???'), reverse=True)
оба doc_skai и doc_added имеют внешний ключ с моделью Document, а модель Document имеет поле 'published_date'.
Как я могу отсортировать список результатов по дате публикации документа?
Вы можете работать с лямбда-выражением:
doc_skai = DocSKAI.objects.all()
doc_added = DocAddedSKAI.objects.all()
result_list = sorted(
chain(doc_skai, doc_added),
key=lambda x: x.document.published_date,
reverse=True
)
Но это приведет к так называемой проблеме N+1: для каждого DocSKAI
и DocAddedSKAI
вы каждый раз будете брать связанный документ.
Вы можете повысить эффективность, выбирая связанный документ с помощью .select_related(..)
[Django-doc]:
doc_skai = DocSKAI.objects.select_related('document')
doc_added = DocAddedSKAI.objects.select_related('document')
result_list = sorted(
chain(doc_skai, doc_added),
key=lambda x: x.document.published_date,
reverse=True
)
Это загрузит все данные соответствующего документа, который может загрузить много данных. Мы также можем работать с аннотацией:
from django.db.models import F
doc_skai = DocSKAI.objects.annotate(published=F('document__published_date'))
doc_added = DocAddedSKAI.objects.annotate(published=F('document__published_date'))
result_list = sorted(
chain(doc_skai, doc_added),
key=attrgetter('published'),
reverse=True
)
При этом мне неясно, почему у вас две разные модели с именами DocSKAI
и DocAddedSKAI
. Похоже, что было бы лучше объединить их в одну модель с булевым атрибутом added
.