Django: Как получить последний X-related-object по критерию и сохранить другие поля?

I have a case of Authors followed by a User, that I want to sort by their latest published Book, as well as display the book's title and release_date. Authors also have books with a release_date in the future, which I want to keep out of the result-set.

Мне нужно вернуть JSON, поскольку Django используется только для бэкенда.

После некоторых исследований лучшее, что я получил, это следующее:

relevant_books = Book.objects.filter(author=OuterRef("pk"), release_date__range=[back_delta, startdate], author__id__in=user_follows).order_by("-release_date")

user_authors_with_books = Author.objects.filter(id__in=user_follows) \
            .annotate(latest_release_date=Subquery(relevant_books.values("release_date")[:1])) \
            .annotate(latest_release_title=Subquery(relevant_books.values("title")[:1])) \
            .filter(latest_release_date__isnull=False) \
            .order_by(F("latest_release_date").desc(nulls_last=True), "id") \
            .values(*fields_to_return, "latest_release_date", "latest_release_title")

Это довольно медленно. Я не большой поклонник аннотирования дважды, и у меня есть ощущение, что есть лучший способ написать этот код Django ORM для более быстрого/эффективного (PostgreSQL) запроса. Я прав?

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