Как получить результат с дополнительными отфильтрованными связанными объектами в виде поля в Django? - PullRequest
1 голос
/ 11 мая 2019

Я хочу получить все данные в одном запросе, поэтому мне нужно добавить какой-либо результат поля из связанного объекта по его фильтру (а не по фильтру родительского объекта).

def get_queryset(self):
        return Mailbox.objects\
            .filter(owner=self.request.user.id)\
            .prefetch_related('letter_set')\
            .annotate(
                new_letter_count=Count(
                    'letter',
                    filter=Q(letter__read_at=None)
                ),
                total_count=Count('letter'),
                latest_letter_datetime=Max('letter__created_at'),


                ### #################### ###
                ### THE QUESTION IS HERE ###
                ### #################### ###

                latest_letter_CONTENT= #(What code here could be work?)#

                ### I wnat to get the latest letter content


            )

1 Ответ

1 голос
/ 11 мая 2019

Хорошо, я отвечу на это, предполагая, что в модели Letter есть ForeignKey, указывающий на модель MailBox.

Для этого вы можете использовать Подзапрос :

# I'm assuming here a couple of things:
# The fields content and date_created exist in your Letter model, 
# if there is no date created field, use instead whatever you are using for
# establish some sort of order creation.
MailBox.objects.annotate(
    last_letter_content = Subquery(
        Letter.objects.filter(mailbox=OuterRef('pk')).order_by('-date_created').values('content')[:1]
    )
)
...