Как выполнить сортировку с помощью 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.

Вернуться на верх