如何使用附加过滤的相关对象作为 Django 中的字段来获取结果?

Posted

技术标签:

【中文标题】如何使用附加过滤的相关对象作为 Django 中的字段来获取结果?【英文标题】:How to get result with additional filtered related objects as a field in Django? 【发布时间】:2019-09-28 20:57:07 【问题描述】:

我想在一个查询中获取所有数据,所以我需要通过它的过滤器从相关对象中添加一些字段结果(不是通过父对象过滤器)。

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】:

好吧,我会假设模型Letter 中有一个ForeignKey 指向模型MailBox

您可以为此使用Subquery:

# 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]
    )
)

【讨论】:

以上是关于如何使用附加过滤的相关对象作为 Django 中的字段来获取结果?的主要内容,如果未能解决你的问题,请参考以下文章

Django Queryset 过滤器检查相关对象是不是存在

如何仅过滤嵌套的相关 django 对象?

如何通过多对一关系中同一相关对象的两个属性在 django 中进行过滤?

Django 中的 Q 对象

如何使用 SQL 的“IN”等字段上的数组过滤 django 查询集?

如何使用 SQL 的“IN”等字段上的数组过滤 django 查询集?