Django: Как получить последний X-related-object по критерию и сохранить другие поля?
I have a case of Author
s 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) запроса. Я прав?